i具有以下XML,我需要转换为下面显示的JSON。我正在使用newtonsoft.json,找不到配置和json:Array
属性的正确组合来获得我的需求。我还有其他属性吗?我需要写一个自定义转换器吗?
这是我的XML:
<Container>
<Encounters>
<Encounter>
<a>a1</a>
<b>b1</b>
</Encounter>
<Encounter>
<a>a2</a>
<b>b2</b>
</Encounter>
</Encounters>
</Container>
这是我需要的JSON:
{
"Container": {
"Encounters" : [
{
"a": "a1",
"b": "b1"
},
{
"a": "a2",
"b": "b2"
}
]
}
}
这是我目前正在得到的JSON:
{
"Container": {
"Encounters" : {
"Encounter" : [
{
"a": "a1",
"b": "b1"
},
{
"a": "a2",
"b": "b2"
}
]
}
}
}
json:Array='true'
不会在这种情况下给您带来所需的结果。此属性旨在信号表明您希望特定的XML元素被视为数组,而当它只有一个,将其转换为JSON。如果特定XML元素的倍数,它们将自动将其视为数组。因此,在您的情况下,多个Encounter
元素将成为单个Encounters
对象中的数组。看来您实际上想将这个级别降低。JSON.NET无法使用XML中的属性来执行此操作。因此,我可以看到三种可能的方法来解决这个问题:
- 在将XML转换为JSON之前,请操纵XML
- 从XML转换后操纵JSON
- 写一个自定义的xml-to-json转换器来完成您想要的事情。
我认为方法2使用Linq-to-json API(jobjects)可能是最容易的:
string xml =
@"<Container>
<Encounters>
<Encounter>
<a>a1</a>
<b>b1</b>
</Encounter>
<Encounter>
<a>a2</a>
<b>b2</b>
</Encounter>
</Encounters>
</Container>";
// Convert XML to a JObject
JObject root = JObject.Parse(JsonConvert.SerializeXNode(XElement.Parse(xml)));
// Move the array of Encounter objects up one level
JProperty encounters = ((JObject)root["Container"]).Property("Encounters");
encounters.Value = encounters.Value["Encounter"];
// Output the JSON
string json = root.ToString();
Console.WriteLine(json);
输出:
{
"Container": {
"Encounters": [
{
"a": "a1",
"b": "b1"
},
{
"a": "a2",
"b": "b2"
}
]
}
}
小提琴:https://dotnetfiddle.net/kk1exr