【发布时间】:2014-07-27 15:14:15
【问题描述】:
眼前的问题
在使用另一个使用 Json.NET 的库时遇到了这个问题。在将 C# 对象序列化为 JSON 以及在客户端应用程序的另一端反序列化它们时,我们一直在大量使用 TypeNameHandling.Arrays。
但是,Json.NET 的 XmlNodeConverter 似乎与此设置不匹配,在反序列化 JSON 时抛出错误,例如:
{
'people': {
'$type': 'System.Collections.Generic.List`1[[MyNamespace.Person, MyDll]], mscorlib',
'$values': [
{
'name': 'Alan'
},
{
'name': 'Bob'
}
]
}
}
原因
抛出异常是因为 Json.NET 尝试将 $values 解释为字符串属性而不是子节点。当在 XmlNodeConverter.cs:1367 周围的空值上调用 .ToString() 时,我们得到空引用异常。
细化
这里的真正问题可能源于 Json.NET 处理 XML 中的数组的方式:它不会生成如下所示的包装器:
<people json:type="System.Collections.Generic.List`1[[MyNamespace.Person, MyDll]], mscorlib">
<person>
<name>Alan</name>
</person>
<person>
<name>Bob</name>
</person>
</people>
...它可以添加自定义json:type 属性,而是依赖于隐式分组共享相同标签的元素:
<person>
<name>Alan</name>
</item>
<person>
<name>Bob</name>
</item>
这种行为对我未经训练的眼睛来说似乎有点不直观——我希望在 XML 中包含一个父元素,而不是默默地删除。 (这可能也是空数组和单元素数组需要额外工作的原因,这里的许多线程和 Json.NET 论坛中都有记录。)
解决方案..?
这里我转向社区..!
- 您是否知道任何变通方法,也许是一些使两者可以很好地发挥作用的设置?
- 删除父节点是序列化数组的正确方法是否已达成共识?
【问题讨论】:
-
您可以随时编写自己的自定义 XmlNodeConverter 以使其按您的意愿工作。
标签: c# arrays xml json json.net