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

时间:2013-10-17 16:41:44

标签: c# json json.net handlebars.js

我有一个XML文档,我需要将其序列化为JSON。在我的handlebars.js失败了“每个”表达之前,我已经完成了所有工作(或者我认为)。我已将问题缩小到我的xml>使用JSON.NET进行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);
    }
}

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

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

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

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

2 个答案:

答案 0 :(得分:6)

当您将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"
    ]
  }
}

答案 1 :(得分:2)

所以如果有人有兴趣的话,我想出了我做错了什么。当我创建属性时:

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

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

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