如何使用ServiceStack JsonSerializer序列化ExpandoObject
本文关键字:序列化 ExpandoObject JsonSerializer ServiceStack 何使用 | 更新日期: 2023-09-27 18:06:21
是否有可能获得ServiceStack JsonSerializer序列化ExpandoObject作为平面对象而不是字典?大致如下:
{"x":"xvalue","y":"'/Date(1313966045485)'/"}
我试图比较ExpandoObject
的JSON序列化使用三个不同的系统:. net BCL JavaScriptSerializer, Newtonsoft JSON。. NET和ServiceStack提供的JSON
我从一个相当简单的动态对象开始。
dynamic test = new ExpandoObject();
test.x = "xvalue";
test.y = DateTime.Now;
对于序列化器来说,将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]"]
我更喜欢在代码中组装ExpandoObject时对其进行序列化,就像对典型的类进行序列化一样。你可以为IDictionary<string, object>
的BCL系统添加一个覆盖JavaScript序列化器。这工作得很好,假设实际上没有需要保持这种方式的IDictionary<string, object>
(我还没有)。
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJsonConverter() });
Console.WriteLine(javaScriptSerializer.Serialize(test));
// {"x":"xvalue","y":"'/Date(1313966045485)'/"}
不幸的是,我仍然需要一种方法让ServiceStack的JsonSerializer以相同的方式处理ExpandoObject。我如何钩入ServiceStack系统来实现这一点?
Update:虽然它不是我使用的选项,但看起来ServiceStack处理匿名对象很好。
Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(new { x = "xvalue", y = DateTime.Now }));
// {"x":"xvalue","y":"'/Date(1313980029620+0000)'/"}
没有任何钩子可用在ServiceStack的JsonSerializer,你可以插入来改变这种行为,但我很乐意采取拉请求,这样做;)
需要修改的类有:
- JsWriter.cs(第223行)-插入代码来检测expando对象并返回一个委托,该委托以您希望的方式写入expando对象。
- JsReader(第42行)—插入代码来检测expando对象,并返回一个委托来读取字符串的内容并将其反序列化回一个expando
我认为处理expando对象的代码类似于字典,所以你应该能够使用字典实现类来指导你(即WriteDictionary.cs和deserializdictionary .cs)
如果你有更多的问题,请使用ServiceStack论坛:https://groups.google.com/forum/!论坛/servicestack