Newtonsoft Deserializexnode错误地扩展了内部阵列



我有一个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的第三个参数设置为正确的思维,这将正确标记数组,但这并不能改变任何内容。

通过我对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?

供参考,这是我正在使用的代码(继承,所以我不确定是否有意义(:

objecttoxml:

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; }
}

我不确定您在文档中读到的何处。我看了看,找不到任何暗示XML应该按照您建议的表现的东西。

这种工作的工作方式是,可以推断出具有相同名称的多个元素为数组。从文档中:

在同一级别上具有相同名称的多个节点分组为一个数组。

,如果只有一个元素起源于数组,那么您正在使用一个超载,该元素指示序列上添加一个属性,表明元素是数组。您的输出看起来像这样:

<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。所以我在这里找不到问题。

您可以在此小提琴中看到结果,包括对MyObj的审理。