Json.NET XML转换和TypeNameHandling.Arrays

Dav*_*Dav 6 c# xml arrays json json.net

眼前的问题

在使用使用Json.NET的不同库时遇到此问题.TypeNameHandling.Arrays在将C#对象序列化为JSON时,我们一直在大量使用它们,并在我们的客户端应用程序中在线路的另一端反序列化它们.

但是,似乎Json.NET对XmlNodeConverter这个设置不好用,在反序列化JSON时抛出错误,例如:

{
  'people': {
    '$type': 'System.Collections.Generic.List`1[[MyNamespace.Person, MyDll]], mscorlib',
    '$values': [
      {
        'name': 'Alan'
      },
      {
        'name': 'Bob'
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

原因

抛出异常是因为Json.NET尝试将其解释$values为字符串属性而不是子节点.当.ToString()在XmlNodeConverter.cs:1367周围的空值上调用时,我们得到一个空引用异常.

这里真正的问题可能源于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>
Run Code Online (Sandbox Code Playgroud)

...它可以添加自定义json:type属性,但是依赖于隐式分组共享相同标记的元素:

<person>
  <name>Alan</name>
</item>
<person>
  <name>Bob</name>
</item>
Run Code Online (Sandbox Code Playgroud)

这种行为对我未经训练的眼睛来说似乎有点不直观 - 我希望XML中包含一个父元素而不是静默删除.(这也可能就是为什么空元素和单元素数组需要额外的工作,因为这里有很多线程和Json.NET论坛.)

解决方案..?

在这里,我转向社区..!

  1. 你知道任何变通方法,也许是一些让两人玩得很好的设置吗?
  2. 是否一致认为删除父节点是序列化数组的正确方法?

小智 0

我的印象是您对 JSON.Net 的利用方式没有太多了解,因为您提到它被另一个库使用。如果您确实具有访问权限,则可以考虑一些选项,例如反序列化为匿名类型,然后添加适当的代码来初始化您的类。(参见:使用 json.net c# 反序列化 json

JSON.net 文档提到了这一点: http://james.newtonking.com/json/help/index.html ?topic=html/ConvertingJSONandXML.htm

“同一级别的多个同名节点被分组到一个数组中。”

“如果从 JSON 创建的 XML 与您想要的不匹配,那么您将需要手动转换它。执行此操作的最佳方法是将 JSON 加载到 LINQ to JSON 对象(如 JObject 或 JArray)中,然后使用 LINQ 来创建XDocument。相反的过程,使用 LINQ 和 XDocument 来创建 JObject 或 JArray,也可以。在此处了解有关将 LINQ to JSON 与 LINQ 结合使用的更多信息。”

对于您的具体问题:

  1. 如果您无法编辑反序列化代码,则没有直接的解决方法可以使反序列化在具有以这种方式构造的数组的 JSON.net 中正常工作。

  2. 两种方法都是有效的。Json.NET 倾向于编写看起来像是手动编写的 JSON 和 XML,而 .Net 序列化器旨在确保在 .Net 中再次反序列化时不会丢失数据。一般来说,理想的情况是在任何地方都使用相同的库 - 实际上 Json.NET 是一种流行的选择。