I have some autogenerated xmls where some parts of the xml may have multiple rows and some may not. The result is that if there is one row a single json node is returned and if I have multiple rows an array with json nodes are returned.
The xmls may look like this
<List> <Content> <Row Index="0"> <Title>Testing</Title> <PercentComplete>0</PercentComplete> <DueDate/> <StartDate/> </Row> </Content> </List>
Or with multiple rows
<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>
When serializing these to JSON using
JsonConvert.SerializeXmlNode(xmldoc, Formatting.Indented);
The first xml becomes this
{ "List": { "Content": { "Row": { "@Index": "0", "Title": "Testing", "PercentComplete": "0", "DueDate": null, "StartDate": null } } } }
And the second this
{ "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" }] } } }
As clearly can be seen the Row on the second one is an array as should be but not on the first one. Is there any known workaround on this kind of issues or do I need to implement the check in my frontend receiving the JSON (that would be a bit problematic since the structures are very dynamic). The best way would be if there where any way to enforce json.net to always return arrays.
From Json.NET documentation: http://james.newtonking.com/projects/json/help/?topic=html/ConvertingJSONandXML.htm
You can force a node to be rendered as an Array by adding the attribute json:Array='true'
to the XML node you are converting to JSON. Also, you need to declare the json prefix namespace at the XML header xmlns:json='http://james.newtonking.com/projects/json'
or else you will get an XML error stating that the json prefix is not declared.
The next example is provided by the documentation:
xml = @"<person xmlns:json='http://james.newtonking.com/projects/json' id='1'> <name>Alan</name> <url>http://www.google.com</url> <role json:Array='true'>Admin</role> </person>";
Generated output:
{ "person": { "@id": "1", "name": "Alan", "url": "http://www.google.com", "role": [ "Admin" ] } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With