Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用ServiceStack JsonSerializer序列化ExpandooObject?_C#_Json_Expandoobject_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,Json,Expandoobject,servicestack" /> servicestack,C#,Json,Expandoobject,servicestack" />

C# 如何使用ServiceStack JsonSerializer序列化ExpandooObject?

C# 如何使用ServiceStack JsonSerializer序列化ExpandooObject?,c#,json,expandoobject,servicestack,C#,Json,Expandoobject,servicestack,是否可以让ServiceStack JsonSerializer将ExpandooObject序列化为平面对象而不是字典?大致与此近似: {"x":"xvalue","y":"\/Date(1313966045485)\/"} 我试图使用三种不同的系统来比较ExpandoObject的JSON序列化:.NET BCL JavaScriptSerializer、Newtonsoft JSON.NET和ServiceStack的JSON产品 我从一个相当简单的动态对象开始 dynamic test

是否可以让ServiceStack JsonSerializer将ExpandooObject序列化为平面对象而不是字典?大致与此近似:

{"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;
序列化程序将ExpandooObject作为
IDictionary
处理似乎更简单。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]"]
我更喜欢将ExpandooObject序列化,因为它是在代码中组装的,就像一个典型的类被序列化一样。你可以。假设一个人没有一个真正需要保持这种状态的
IDictionary
(我现在还没有)

不幸的是,我仍然需要一种方法让ServiceStack的JsonSerializer以同样的方式处理ExpandooObject。如何连接到ServiceStack系统以实现这一点

更新:虽然它不是我使用的选项,但看起来ServiceStack可以很好地处理匿名对象

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

ServiceStack的JsonSerializer中没有任何可用的钩子可供您插入以更改此行为,但我非常乐意接受一个执行此操作的拉动请求;)

您需要更改的类包括:

  • (第223行)-插入用于检测expando对象的代码,并返回一个委托,该委托按照您的要求写入expando对象
  • (第42行)-插入代码以检测expando对象,并返回委托以读取字符串内容并将其反序列化回expando
我认为处理expando对象的代码类似于字典,因此您应该能够使用字典实现类来指导您(即和)

如果您对此有任何疑问/问题,请随时使用ServiceStack论坛:

如果我可以让MonoTouch使用ServiceStack来反序列化从其他系统生成的JSON,那么这个特定的问题实际上不会对我造成太大的伤害。即使我能解决这个问题,我也会试着看看我能做些什么来为拉取请求整合一些代码;在我当前项目的两端使用ServiceStack会很好。当然,要让ServiceStack在MonoTouch上工作,您只需要使用MonoTouch构建,该构建可以在以下位置获得:这很容易。我在几分钟内就把它修好了。如果我不在MonoDevelop中重新学习键盘快捷键的话,那就需要几秒钟的时间了。
Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(new { x = "xvalue", y = DateTime.Now }));
// {"x":"xvalue","y":"\/Date(1313980029620+0000)\/"}