我想創建一個緊密符合C#對象圖及其JSON表示的XML文檔,但是在XML中的列表表示方面遇到困難。鑑於這種圖表如何使用JSON與數組項的父節點生成XML
public class X
{
public List<A> Aa { get; set; }
}
public class A
{
public int B;
public bool C;
}
我把JSON從上面,並試圖將其轉換幾種方法:
var json = @"{""Aa"":[{""B"":186,""C"":true},{""B"":9,""C"":false},{""B"":182,""C"":true}]}";
var xml = JsonConvert.DeserializeXNode(json, typeof(T).Name, false);
var xml2 = JsonToXml(json);
這產生用於xml
(無Aa
「容器節點」)執行以下操作:
<X>
<Aa><B>186</B><C>true</C></Aa>
<Aa><B>9</B><C>false</C></Aa>
<Aa><B>182</B><C>true</C></Aa>
</X>
併爲xml2
(具有 「容器」 節點,但一些額外的噪聲):
<root type="object">
<Aa type="array">
<item type="object">
<B type="number">186</B>
<C type="boolean">true</C>
</item>
<item type="object">
<B type="number">9</B>
<C type="boolean">false</C>
</item>
<item type="object">
<B type="number">182</B>
<C type="boolean">true</C>
</item>
</Aa>
</root>
用於生產值xml2
的方法來自於different approach using the .NET Framework:
XDocument JsonToXml(string jsonString)
{
using (var stream = new MemoryStream(Encoding.ASCII.GetBytes(jsonString)))
{
var quotas = new XmlDictionaryReaderQuotas();
return XDocument.Load(JsonReaderWriterFactory.CreateJsonReader(stream, quotas));
}
}
我想產生是
<X>
<Aa>
<A><B>186</B><C>true</C></A>
<A><B>9</B><C>false</C></A>
<A><B>182</B><C>true</C></A>
</Aa>
</X>
我試圖改變的DeserializeXDocument的writeArrayAttribute
參數設置爲true ,但那也行不通。 converting between JSON and XML的文檔不起作用。
如何生成包含父節點Aa
節點中的項目的精簡版本?這是否需要一些自定義解串器?
原始JSON經由
var json = JsonConvert.SerializeObject(new X { etc }, Formatting.None, settings);
那麼JSON看起來不是這樣嗎? '{「Aa」:{「B」:[30,2,31]}}'或類似的東西?您輸入的XML輸出對我來說看起來是正確的,因爲您請求了一系列'Aa'項目,而不是'B'項目。你可以嘗試構建出序列化到你想要的XML的POCO,然後序列化爲JSON,看看它做了什麼,這樣你就可以比較兩者。 – TyCobb
我更新了一個稍微不太人爲的例子。 – Kit
'{「Aa」:{「A」:[{「B」:186,「C」:true},{「B」:9,「C」:false},{「B」:182, 「:true}]}}'應該產生你想要的所需的XML。數組的鍵將用作數組內每個對象/值的父元素。您的原始XML看起來很愚蠢可能是因爲您錯過了XmlSerialization屬性,它告訴它它需要如何序列化。 ''[XmlElement(「A」)]'可能會刪除'item'標記,或者可能已經完成了[XmlArray(「Aa」)] [XmlArrayItem(「A」)]'產生父'Aa '和孩子'A'。 – TyCobb