繁体   English   中英

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

[英]Getting unexpected result when adding json:Array attribute to an xml node before serializing

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM