C# 在序列化之前向xml节点添加json:Array属性时获得意外结果

C# 在序列化之前向xml节点添加json:Array属性时获得意外结果,c#,json,json.net,handlebars.js,C#,Json,Json.net,Handlebars.js,我有一个XML文档需要序列化为JSON。在我的handlebar.js在“each”表达式上出现问题之前,我一直都在工作(或者我认为是这样)。我已经将问题缩小到使用json.NET进行xml>json转换。有时可能有多个子元素的元素在转换为json时呈现为单个元素(而不是数组)。文档中指出,我必须向节点添加一个属性(json:Array=“true”),使其始终呈现为数组(不再打断我的把手) 我要做的第一件事是将名称空间添加到XML文档() 然后,我遍历每个节点,并对其进行测试,以查看是否需要添

我有一个XML文档需要序列化为JSON。在我的handlebar.js在“each”表达式上出现问题之前,我一直都在工作(或者我认为是这样)。我已经将问题缩小到使用json.NET进行xml>json转换。有时可能有多个子元素的元素在转换为json时呈现为单个元素(而不是数组)。文档中指出,我必须向节点添加一个属性(json:Array=“true”),使其始终呈现为数组(不再打断我的把手)

我要做的第一件事是将名称空间添加到XML文档()

然后,我遍历每个节点,并对其进行测试,以查看是否需要添加该属性

//Pseudo code
foreach(XmlNode node in list)
{
    XmlAttribute attr = originalDoc.CreateAttribute(@"json:Array");
    if(node.Name == "needsToBeAnArray")
    {
        node.Attributes.Append(attr);
    }
}
然后将文档保存到内存流中,并将其重新加载到新的XmlDocument对象中

然而,我得到的结果json如下所示:

{"@Array":"true","item":[{"subitem":"foo", "subitem2":"foo2"}]}

根据我对JSON.NET文档的理解,它应该只是呈现为一个数组(而不是显示这个“@array”东西)。有没有人有过和经历过这个问题?

所以如果有人感兴趣,我就知道我做错了什么。创建属性时:

XmlAttribute attr = originalDoc.CreateAttribute(@"json:Array");
我想用我的前缀给它命名。正确的方法是将前缀、名称和命名空间作为参数传入

XmlAttribute attr = doc.CreateAttribute("json", "Array", "http://james.newtonking.com/projects/json");

当您将
json
前缀添加到节点时,它似乎从
json:Array
属性中剥离出来,因为它没有限定名称空间。如果没有
json
前缀,该属性对json.Net没有特殊意义;因此,它被写入JSON,而不是更改输出行为

请像这样尝试:

string xml =
    @"<person>
      <name>Joe</name>
      <age>28</age>
      <role>Admin</role>
    </person>";

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

foreach (XmlNode node in doc.DocumentElement.ChildNodes)
{
    if (node.Name == "role")
    {
        XmlAttribute att = doc.CreateAttribute("json", "Array", "http://james.newtonking.com/projects/json");
        att.Value = "true";
        node.Attributes.Append(att);
    }
}

string json = JsonConvert.SerializeXmlNode(doc);

Console.WriteLine(json);

一小时前你在哪里布赖恩;)哈哈,想弄明白为什么它对你不起作用;-)看起来我们两个是并行工作的。
{
  "person": {
    "name": "Joe",
    "age": "28",
    "role": [
      "Admin"
    ]
  }
}