c# - Newtonsoft DeserializeXNode 错误地扩展了内部数组

标签 c# arrays json xml json.net

我有一个如下所示的 JSON 对象:

{
  "property1": "value1",
  "property2": "value2",
  "property3": ["value3","value4","value5"]
}

但是,当我尝试使用 DeserializeXNode 转换为 XML 时,数组消失了。

<MyObj>
    <property1>value1</property1>
    <property2>value2</property2>
    <property3>value3</property3>
    <property3>value4</property3>
    <property3>value5</property3>
</MyObj>

当我尝试重新序列化回对象时,这会导致问题,因为我收到“无法将字符串转换为字符串 []”错误。此外,当我尝试解析文档时,重复的属性被覆盖,只剩下最后一个值。我已经尝试将 DeserializeXNode 的第三个参数设置为 true thinking 以正确标记数组,但这并没有改变任何东西。

根据我对 Newtonsoft 文档的理解,XML 应该更像:

<MyObj>
    <property1>value1</property1>
    <property2>value2</property2>
    <property3 type="array">
        <item>value3</item>
        <item>value4</item>
        <item>value5</item>
    </property3>
</MyObj>

我需要做什么才能使数组正确转换为 XML,以便它作为数组返回 JSON?

作为引用,这是我正在使用的代码(继承的,所以我不确定它是否有意义):

对象到 XML:

var json = JsonConvert.SerializeObject(o);
var xdoc = JsonConvert.DeserializeXNode(json, "MyObj", true);
return xdoc.ToString();

XMLToObject:

XDocument d = XDocument.Parse(xml, LoadOptions.None);
d.Descendants().ForEach(e => e.Attributes().Remove());
var json = JsonConvert.SerializeXNode(d);
json = json.Replace("\"?xml\":{\"@version\":\"1.0\",\"@encoding\":\"utf-16\"},\"MyObj\":{", "")
    .Replace("{\"MyObj\":", "")
    .Replace("}}", "}")
    .Replace("{\"anyType\":", "")
    .Replace("]}", "]");
return JsonConvert.DeserializeObject<T>(json);

对象本身:

public class MyObj
{
    public string property1 { get; set; }
    public string property2 { get; set; }
    public string[] property3 { get; set; }
}

最佳答案

我不确定您在 documentation 的什么地方读到过这篇文章.我已经看过,但找不到任何表明 XML 应该像您所建议的那样的内容。

它的工作原理是可以将具有相同名称的多个元素推断为一个数组。来自文档:

Multiple nodes with the same name at the same level are grouped together into an array.

如果只有一个元素源自一个数组,那么您正在使用一个重载,它指示序列化程序添加一个属性,指示该元素是一个数组。你的输出看起来像这样:

<MyObj xmlns:json="http://james.newtonking.com/projects/json">
  <property1>value1</property1>
  <property2>value2</property2>
  <property3 json:Array="true">value3</property3>
</MyObj>

如果您使用此代码通过 XML 往返:

var asXml = JsonConvert.DeserializeXNode(json, "MyObj", writeArrayAttribute: true);
var asJson = JsonConvert.SerializeXNode(asXml, Formatting.Indented, omitRootObject: true);

您会得到完全相同的 JSON。所以我在这里找不到问题。

您可以在this fiddle 中看到结果,包括反序列化为 MyObj

关于c# - Newtonsoft DeserializeXNode 错误地扩展了内部数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43637298/

相关文章:

java - 读取文件文本的特定部分,然后将它们添加到数组中

java - 尝试检索 json 节点时出现 ClassCastException

c# - 如何创建可以返回 double 或小数的通用 C# 方法?

c# - 如何分解 try/catch 代码?

javascript - CodeCamp 算法虚假保镖

javascript - AngularJS - 使用 ng-repeat 打印 JSON

java - Android 上的 jackson : NoClassDefFoundError ObjectMapper error

c# - 将 Excel 文件导入 DataGridView

c# - 使用 jquery 设置一个值,在提交数据时删除对 ViewModel 的绑定(bind)

python - 如何为 numpy genfromtxt 设置字符串到浮点转换器