如何使用 ServiceStack JsonSerializer 序列化 ExpandoObject?

2024-04-27

是否可以让 ServiceStack JsonSerializer 将 ExpandoObject 序列化为平面对象而不是字典?大致类似于这样:

{"x":"xvalue","y":"\/Date(1313966045485)\/"}

我正在尝试比较 JSON 序列化ExpandoObject使用三种不同的系统:.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 序列化更多,因为它是在代码中组装的,就像序列化典型的类一样。你可以将覆盖 JavaScript 序列化器添加到 BCL 系统IDictionary<string, object> https://stackoverflow.com/questions/5156664/how-to-flatten-an-expandoobject-returned-via-jsonresult-in-asp-net-mvc/5913094#5913094。假设一个人实际上没有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 https://github.com/ServiceStack/ServiceStack.Text/blob/master/src/ServiceStack.Text/Common/JsWriter.cs#L223(第223行)-插入代码来检测expando对象并返回一个委托,该委托按照您想要的方式写入expando对象。
  • JsReader https://github.com/ServiceStack/ServiceStack.Text/blob/master/src/ServiceStack.Text/Common/JsReader.cs#L42(第 42 行)- 插入代码来检测 Expando 对象并返回委托来读取字符串的内容并将其反序列化回 Expando

我想处理 Expando 对象的代码类似于字典,因此您应该能够使用 Dictionary 实现类来指导您(即WriteDictionary.cs https://github.com/ServiceStack/ServiceStack.Text/blob/master/src/ServiceStack.Text/Common/WriteDictionary.cs and 反序列化字典.cs https://github.com/ServiceStack/ServiceStack.Text/blob/master/src/ServiceStack.Text/Common/DeserializeDictionary.cs)

如果您对此还有任何疑问/问题,请随时使用 ServiceStack 论坛:https://groups.google.com/forum/#!forum/servicestack https://groups.google.com/forum/#!forum/servicestack

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 ServiceStack JsonSerializer 序列化 ExpandoObject? 的相关文章

随机推荐