3

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

我要做的第一件事是将命名空间添加到我的 XML 文档 ( http://james.newtonking.com/projects/json )。

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

//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”的东西)。有没有人遇到过这个问题?

4

2 回答 2

8

当您将前缀添加到节点时,似乎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"
    ]
  }
}
于 2013-10-17T18:38:52.473 回答
2

因此,如果有人感兴趣,我会弄清楚我做错了什么。当我创建属性时:

XmlAttribute attr = originalDoc.CreateAttribute(@"json:Array");

我试图用我的前缀命名它。正确的方法是传入前缀、名称和命名空间作为参数。

XmlAttribute attr = doc.CreateAttribute("json", "Array", "http://james.newtonking.com/projects/json");
于 2013-10-17T18:35:29.127 回答