325 votes

Json.NET: convertit la chaîne JSON en XML ou XML en chaîne JSON

J'ai commencé à utiliser Json.NET pour convertir une chaîne au format JSON en objet ou vice versa. Je ne suis pas sûr dans le framework Json.NET, est-il possible de convertir une chaîne au format JSON au format XML et vice versa?

478voto

David Brown Points 14365

Oui. Utilisation de la classe JsonConvert qui contient des méthodes d'aide à cet effet précis:

 // To convert an XML node contained in string xml into a JSON string   
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);

// To convert JSON text contained in string json into an XML node
XmlDocument doc = JsonConvert.DeserializeXmlNode(json);
 

Documentation ici: Conversion entre JSON et XML avec Json.NET

60voto

montewhizdoh Points 88

Oui, vous pouvez le faire (je le fais), mais Être conscient de certains paradoxes lors de la conversion, et de gérer de manière appropriée. Gardez à l'esprit que je suis en utilisant les paramètres par défaut avec Newtonsoft librairie json et MS bibliothèque XML, de sorte que votre kilométrage peut varier:

XML->JSON

  1. Toutes les données sont des données de chaîne (par exemple, vous obtiendrez toujours des "faux" pas de faux ou de "0" pas de 0) Évidemment javascript traite ces différemment dans certains cas.
  2. Les enfants les éléments peuvent devenir sous-objet OU de la sous matrice en fonction de si il y a seulement un ou plus d'un enfant de l'élément. Vous n'en consomment ces deux différemment en javascript. Le même XML valide peut produire différents JSON structures de cette façon. Vous pouvez ajouter l'attribut json:Array='true' pour votre élément de solution dans certains cas.
  3. Votre XML doit être assez bien formé, j'ai remarqué qu'il ne faut pas parfaitement conformes aux standards du W3C, mais 1. vous devez avoir un élément racine et 2. vous ne pouvez pas lancer des noms d'élément avec les numéros sont deux des appliqué les normes XML que j'ai trouvé lors de l'utilisation de Newtonsoft et MS bibliothèques.
  4. Vide éléments ne permettent pas de convertir en JSON. Ils sont ignorés. Un vide élément ne devient pas un"élément":null

JSON->XML

  1. Vous avez besoin d'un haut niveau d'objet qui permet de convertir à un élément XML racine ou l'analyseur va échouer.
  2. Vos noms d'objet ne peut pas commencer par un nombre, comme ils ne peuvent pas être converties en éléments XML (est techically encore plus stricte que cela, mais je peux "sortir" avec la rupture de tous? l'autre élément, les règles de nommage.

N'hésitez pas à mentionner toutes les autres questions que vous avez remarqué, j'ai développé mes propres routines personnalisées pour la préparation et le nettoyage des cordes comme je le convertir en arrière et en avant. Votre situation peut ou ne peut pas appeler pour prep/de nettoyage.

37voto

StaxMan Points 34626

Je ne sais pas il est inutile de cette conversion (Oui, beaucoup faire, mais surtout pour forcer une pièce carrée trou rond)--il y a différence d’impédance structurelle et la conversion est figée. Donc je recommanderais contre de telles transformations à format-format.

Mais si vous le faites, convertissez d’abord json en objet, puis de l’objet au format xml (et inversement pour le sens inverse). Faire la transformation directe conduit à sortie laid, perte d’informations ou peut-être les deux.

32voto

David.Chu.ca Points 7621

Merci pour la réponse de David Brown. Dans mon cas de JSON.Net 3.5, les méthodes convert sont sous la classe statique JsonConvert:

 XmlNote myXmlNode = JsonConvert.DeserializeXmlNode(myJsonString);
// or .DeserilizeXmlNode(myJsonString, "root"); // if myJsonString does not have a root
string jsonString = JsonConvert.SerializeXmlNode(myXmlNode);
 

9voto

yourbuddypal Points 149

J’ai cherché longtemps trouver un code alternatif à la solution acceptée dans l’espoir de ne pas utiliser un assembly externe / projet. Je suis venu avec ce qui suit grâce au code source du projet DynamicJson :

Remarque : J’ai voulu un XmlDocument plutôt qu’un objet XElement à des fins de xPath. En outre, ce code va évidemment seulement de json à Xml, il existe différentes façons de faire le contraire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X