相关疑难解决方法(0)

如何在C#MVC Controller操作中将动态对象序列化为JSON?

我想将动态对象序列化为JSON.我尝试使用ExpandoObject,但结果不是我需要的:

public JsonResult Edit()
{   
    dynamic o = new ExpandoObject();
    ((IDictionary<string,Object>)o)["abc"] = "ABC"; //or o.abc = "ABC";
    return Json(o);
}
Run Code Online (Sandbox Code Playgroud)

我希望JSON看起来像:{"abc":"ABC"}但它看起来像[{"Key":"abc","Value":"ABC"}]显然ExpandoObject不会这样做,但我可以继承吗从DynamicObject以某种方式覆盖其方法来实现我想要的JSON格式?

c# asp.net-mvc serialization json

12
推荐指数
2
解决办法
2万
查看次数

如何使用ServiceStack JsonSerializer序列化ExpandoObject?

是否有可能让ServiceStack JsonSerializer将ExpandoObject序列化为扁平对象而不是字典?大致与此近似的东西:

{"x":"xvalue","y":"\/Date(1313966045485)\/"}
Run Code Online (Sandbox Code Playgroud)

我试图比较ExpandoObject使用三种不同系统的JSON序列化:.NET BCL JavaScriptSerializer,Newtonsoft JSON.NET和ServiceStack的JSON产品.

我从一个相当简单的动态对象开始.

dynamic test = new ExpandoObject();
test.x = "xvalue";
test.y = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

对于序列化程序来说,将ExpandoObject视为一个似乎更简单IDictionary<string, object>.BCL和ServiceStack都是以这种方式开始的,尽管与结果的路线差别很大.

JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
Console.WriteLine(javaScriptSerializer.Serialize(test));
// [{"Key":"x","Value":"xvalue"},{"Key":"y","Value":"\/Date(1313966045485)\/"}]

Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(test));
// ["[x, xvalue]","[y, 8/21/2011 16:59:34 PM]"]
Run Code Online (Sandbox Code Playgroud)

我更喜欢将ExpandoObject序列化更多,因为它是在代码中组装的,就像典型的类会被序列化一样.您可以将覆盖JavaScript序列化IDictionary<string, object>程序添加到BCL系统中.这很有效,假设一个人实际上并不IDictionary<string, object>需要保持那种方式(我还没有).

JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJsonConverter() });
Console.WriteLine(javaScriptSerializer.Serialize(test));
// {"x":"xvalue","y":"\/Date(1313966045485)\/"}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我仍然需要一种让ServiceStack的JsonSerializer以同样的方式处理ExpandoObject的方法.如何挂钩ServiceStack系统以实现这一目标?

更新:虽然它不是我使用的选项,但看起来ServiceStack处理匿名对象就好了.

Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(new { x = "xvalue", y = DateTime.Now }));
// {"x":"xvalue","y":"\/Date(1313980029620+0000)\/"}
Run Code Online (Sandbox Code Playgroud)

c# json expandoobject servicestack

6
推荐指数
1
解决办法
3008
查看次数

如何使WebMethods序列化ExpandoObject

我有一个看起来像这样的WebMethod用于填充jqGrid

[System.Web.Script.Services.ScriptService]
public class MyWebService: System.Web.Services.WebService
{
    [WebMethod]
    [Authorize(Roles = "Admin")]
    public object GetPeople(bool _search, double nd, int rows, int page, string sidx, string sord)
    {
        var tbl = new DynamicModel("ConnStr", tableName: "Person", primaryKeyField: "ID");
        var results = tbl.Paged(orderBy: sidx + " " + sord, currentPage: page, pageSize: rows);
        return results;
    }

}
Run Code Online (Sandbox Code Playgroud)

"results"是一个System.Dynamic.ExpandoObject,其属性为Items,TotalPages,TotalRecords

我从webservice上回来的json看起来像这样

{
"d": [{
    "Key": "TotalRecords",
    "Value": 1
}, {
    "Key": "TotalPages",
    "Value": 1
}, {
    "Key": "Items",
    "Value": [
        [{
            "Key": "Row",
            "Value": 1
        }, …
Run Code Online (Sandbox Code Playgroud)

asp.net json asmx expandoobject

5
推荐指数
1
解决办法
2116
查看次数

使用ServiceStack.Text序列化ExpandoObject

我正在尝试使用库ServiceStack.Text序列化对象.这有效

using System.Dynamic;
using ServiceStack.Text;
var x = new {Value= 10, Product = "Apples"};                
Console.WriteLine(JsonSerializer.SerializeToString(x));
Run Code Online (Sandbox Code Playgroud)

我得到了,正如我所料

{"Value":10,"Product":"Apples"}
Run Code Online (Sandbox Code Playgroud)

然而

dynamic x = new ExpandoObject();
x.Value = 100;
x.Product = "Apples";
Console.WriteLine(JsonSerializer.SerializeToString(x));
Run Code Online (Sandbox Code Playgroud)

我很惊讶

[{"Key":"Value","Value":100},{"Key":"Product","Value":"Apples"}]
Run Code Online (Sandbox Code Playgroud)

为什么!这是怎么回事?

其次,我怎样才能得到我想要的东西?

.net c# json servicestack

5
推荐指数
1
解决办法
2086
查看次数