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 に答える