我想将动态对象序列化为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格式?
是否有可能让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) 我有一个看起来像这样的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) 我正在尝试使用库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)
为什么!这是怎么回事?
其次,我怎样才能得到我想要的东西?