使用 Json.Net 转换为 XML 时如何序列化空数组

Posted

技术标签:

【中文标题】使用 Json.Net 转换为 XML 时如何序列化空数组【英文标题】:How to serialize empty arrays when converting to XML with Json.Net 【发布时间】:2014-01-25 09:55:37 【问题描述】:

我需要将一些 Json 转换为 XML,但是当我这样做时,它会删除所有空数组/列表/集合/等...

如何让它将数组包含为空项?

示例 Json:

 
  "EmptyCollection": [], 
  "OtherPorperty\": "TestValue" 

C#代码:

var jsonString = " \"EmptyCollection\": [], \"OtherPorperty\":\"TestValue\" ";


var xmlDoc = JsonConvert.DeserializeXmlNode(jsonString, "root", true);
Console.WriteLine(xmlDoc.InnerXml);

实际结果是

<root>
  <OtherPorperty>TestValue</OtherPorperty>
</root>

想要的结果是

<root>
  <EmptyCollection></EmptyCollection>
  <OtherPorperty>TestValue</OtherPorperty>
</root> 

or 

<root>
  <EmptyCollection />
  <OtherPorperty>TestValue</OtherPorperty>
</root>

使用 writeArrayAtribute 似乎不起作用。

【问题讨论】:

【参考方案1】:

我认为意思有问题。我个人认为,Json 库完成的转换是好的,你不能得到你提出的两个结果之一。 建议的每个场景中的标签并不意味着(从 XML 的角度来看)它是一个空数组。但这意味着属性(不是数组) EmptyCollection 是空的。你会失去一些东西。

我建议您将标签的缺失测试为“无信息”,也就是“数组中没有条目”

【讨论】:

空元素和空集合并不严格相同,但它比当前更接近转换。目前它是有损的。我需要能够将其转换回来,但这是不可能的,因为它指出该字段是必需的并且缺少。 如果您需要该字段,一种常见的方法应该是定义一个空元素。在许多算法中,例如在红黑树中,叶子不是具有两个空指针的节点,而是具有空值的节点。所以取而代之的是: 您可以尝试获取: null (仅作为示例)可能你需要使用 Json 作为源,例如: Collection:[ myelem: null ] 希望这会有所帮助。 我有一个正在序列化的大型对象图,我真的不想检查所有集合并向它们添加空项并稍后再次删除它们。 一个机会是在每种情况下都将空元素添加为最后一个。 (就像在 C-String 中一样)。所以你的“JSON数组/XML标签”每次都充满了一些东西,很容易检测或跳过

以上是关于使用 Json.Net 转换为 XML 时如何序列化空数组的主要内容,如果未能解决你的问题,请参考以下文章

Json.NET XML 转换和 TypeNameHandling.Arrays

Json/XML序列化和反序列化

使用 Json.Net 进行 C# 枚举反序列化:将值转换为类型时出错

如何使用 Json.NET 将 XML 序列化为 JSON 对象

序列化特定类型时如何使 JSON.Net 序列化程序调用 ToString()?

Newtonsoft.Json Json.Net01介绍