簡體   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