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

mac*_*ura 3 c# json json.net handlebars.js

我有一个XML文档,我需要序列化为JSON.在我的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我将doc保存到内存流并将其重新加载到新的XmlDocument对象中.

然而,我得到的json看起来像这样:

{"@Array":"true","item":[{"subitem":"foo", "subitem2":"foo2"}]}
Run Code Online (Sandbox Code Playgroud)

根据我对JSON.NET文档的理解,它应该只是渲染为一个数组(不显示这个"@Array"的东西).有没有人有这个问题的经验?

Bri*_*ers 7

当您将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);
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "person": {
    "name": "Joe",
    "age": "28",
    "role": [
      "Admin"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 哈哈,试图找出为什么它不适合你;-) 看起来我们都在并行工作。 (2认同)