pat*_*dge 6 c# json expandoobject servicestack
是否有可能让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)
ServiceStack 的 JsonSerializer 中没有任何可用的钩子可以插入来更改此行为,但我非常乐意接受执行此操作的拉取请求;)
您需要更改的类是:
我想处理 Expando 对象的代码类似于字典,因此您应该能够使用 Dictionary 实现类来指导您(即WriteDictionary.cs和DeserializeDictionary.cs)
如果您对此还有任何疑问/问题,请随时使用 ServiceStack 论坛: https://groups.google.com/forum/# !forum/servicestack
| 归档时间: |
|
| 查看次数: |
3008 次 |
| 最近记录: |