我有一些自动生成的xml,其中xml的某些部分可能有多行,而有些则没有。结果是,如果只有一行,则返回一个json节点,如果我有多行,则返回带有json节点的数组。
xml可能看起来像这样
<List> <Content> <Row Index="0"> <Title>Testing</Title> <PercentComplete>0</PercentComplete> <DueDate/> <StartDate/> </Row> </Content> </List>
或多行
<List> <Content> <Row Index="0"> <Title>Update Documentation</Title> <PercentComplete>0.5</PercentComplete> <DueDate>2013-01-31 00:00:00</DueDate> <StartDate>2013-01-01 00:00:00</StartDate> </Row> <Row Index="1"> <Title>Write jQuery example</Title> <PercentComplete>0.05</PercentComplete> <DueDate>2013-06-30 00:00:00</DueDate> <StartDate>2013-01-02 00:00:00</StartDate> </Row> </Content> </List>
使用时将这些序列化为JSON
JsonConvert.SerializeXmlNode(xmldoc, Formatting.Indented);
第一个xml变成这个
{ "List": { "Content": { "Row": { "@Index": "0", "Title": "Testing", "PercentComplete": "0", "DueDate": null, "StartDate": null } } } }
第二个
{ "List": { "Content": { "Row": [{ "@Index": "0", "Title": "Update Documentation", "PercentComplete": "0.5", "DueDate": "2013-01-31 00:00:00", "StartDate": "2013-01-01 00:00:00" }, { "@Index": "1", "Title": "Write jQuery example", "PercentComplete": "0.05", "DueDate": "2013-06-30 00:00:00", "StartDate": "2013-01-02 00:00:00" }] } } }
可以清楚地看到,第二个行上的Row是应该的数组,但第一个行上不是。在这种问题上是否有任何已知的解决方法,还是我需要在接收JSON的前端中执行检查(这会有些问题,因为结构非常动态)。最好的方法是,是否有任何方法可以强制json.net始终返回数组。
我确实解决了这种问题
// Handle JsonConvert array bug var rows = doc.SelectNodes("//Row"); if(rows.Count == 1) { var contentNode = doc.SelectSingleNode("//List/Content"); contentNode.AppendChild(doc.CreateNode("element", "Row", "")); // Convert to JSON and replace the empty element we created but keep the array declaration returnJson = JsonConvert.SerializeXmlNode(doc).Replace(",null]", "]"); } else { // Convert to JSON returnJson = JsonConvert.SerializeXmlNode(doc); }
有点脏,但是可以用。我仍然对其他解决方案感兴趣!