Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON.Net Xml Serialization misunderstands arrays

Tags:

json

c#

json.net

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.

like image 555
Eric Herlitz Avatar asked Jan 23 '13 20:01

Eric Herlitz


1 Answers

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"     ]   } } 
like image 132
Iván Pérez Gómez Avatar answered Sep 24 '22 17:09

Iván Pérez Gómez