JSON.Net la Sérialisation Xml se méprend sur les tableaux
J'ai quelques générée automatiquement xmls où certaines parties du document xml peut avoir plusieurs lignes et certains ne peuvent pas. Le résultat est que si il ya une ligne d'un seul json nœud est retourné et si j'ai plusieurs lignes d'un tableau json noeuds sont retournés.
Les xmls peut ressembler à ceci
<List>
<Content>
<Row Index="0">
<Title>Testing</Title>
<PercentComplete>0</PercentComplete>
<DueDate/>
<StartDate/>
</Row>
</Content>
</List>
Ou avec plusieurs lignes
<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>
Lors de la sérialisation de ces JSON à l'aide de
JsonConvert.SerializeXmlNode(xmldoc, Formatting.Indented);
La première xml devient ce
{
"List": {
"Content": {
"Row": {
"@Index": "0",
"Title": "Testing",
"PercentComplete": "0",
"DueDate": null,
"StartDate": null
}
}
}
}
Et le second, ce
{
"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"
}]
}
}
}
Comme peut clairement être vu la Ligne sur le second est un tableau que devrait être, mais pas sur la première. Est-il une solution connue à ce genre de questions ou ai-je besoin pour mettre en œuvre le vérifier dans mon frontend réception du JSON (ce serait un peu problématique parce que les structures sont très dynamiques). La meilleure façon serait si là où de toute façon d'appliquer json.net toujours y revenir tableaux.
- J'ai trouvé le même problème s'il vous plaît trouver un autre soluntion si (XDocument.Parse("<RUT3><row><FromKG>5.00</FromKG><ToKG>21.00</ToKG><Rate>45.00</Rate></row></RUT3>").Descendants("row").Count() > 1) { } si (XDocument.Parse("<RUT3><row><FromKG>1.00</FromKG><ToKG>5.00</ToKG><Rate>45.00</Rate></row><row><FromKG>6.00</FromKG><ToKG>10.00</ToKG><Rate>65.00</Rate></row><row><FromKG>11.00</FromKG><ToKG>100.00</ToKG><Rate>98.00</Rate></row></RUT3>").Descendants("row").Count() > 1) { }
Vous devez vous connecter pour publier un commentaire.
De Json.NET documentation:
http://james.newtonking.com/projects/json/help/?topic=html/ConvertingJSONandXML.htm
Vous pouvez forcer un nœud à être rendu sous forme d'un Tableau en ajoutant l'attribut
json:Array='true'
le nœud XML convertir en JSON. Aussi, vous devez déclarer le json préfixe d'espace de noms à l'en-tête XMLxmlns:json='http://james.newtonking.com/projects/json'
ou autre, vous obtiendrez un fichier XML d'erreur indiquant que le json préfixe n'est pas déclaré.Le prochain exemple est fourni par la documentation:
De sortie généré:
Je n'ai corriger ce comportement comme ça
C'est un peu sale, mais il fonctionne. Je suis toujours intéressé à d'autres solutions!
Donner mon +1 pour Iván Pérez Gómez et de fournir des code ici à l'appui de sa réponse:
Ajouter l'json.net espace de noms pour le nœud racine:
Et à ajouter json:Tableau d'attribut à des éléments trouvés par xpath:
Voici un exemple d'un nœud enfant unique comme un tableau json:
Ma solution: si JsonConvert ne fonctionne pas, ne l'utilisez pas. Analyser les données XML dans des dictionnaires et des collections, puis en Json. Au moins de cette façon vous n'avez pas à coder en dur l'un quelconque des noms d'élément.
Même problème à l'aide de XDocument
si (XDocument.Parse("5.0021.0045.00").Descendants("ligne").Count() > 1)
{
}