JSON correspondant à un document XML avec des attributs?
Je suis en train de concevoir une API pour ma webapp.
Je pensais à prendre en charge uniquement réponses JSON (non XML) parce que plus simple.
Mais j'ai juste repoussé à ce XML:
<folders>
<folder id="123" private="0" archived="0" order="1">Shopping</folder>
</folders>
et je me demandais comment le correspondant JSON serait. J'ai le sentiment, dans ce cas, XML serait plus compact.
Grâce,
Dan
Vous devez vous connecter pour publier un commentaire.
Peut-être:
Parce qu'il n'y est pas une correspondance exacte entre XML et JSON, vous êtes libre (par exemple à définir) comment les deux données-structures de carte. Par exemple, dans le ci-dessus, le "dossier" de l'élément est implicite dans les objets imbriqués dans les "dossiers" de la matrice.
Cela pourrait être développée comme dans:
Etc, mais il y a toujours le problème de ne pas être capable de capturer du contenu+attributs de manière aussi cohérente que XML. Dans tous les cas, votre structure de données -> JSON|XML sérialiseur susceptibles fonctionne d'une manière particulière (et s'il vous plaît, s'il vous plaît, utiliser une bibliothèque, pas de "roulés à la main" JSON-chaîne-munging). C'est le format XML et JSON doit être uniformément dictée (en quelque sorte) par la structure des données pour la transmission.
<folders> <id>123</id> <private>0</private> <archived>0</archived> <order>1</order> <title>Shopping</title> </folders>
Mais pas ce qui était demandé par les ts.Cette approche soutient la transformation inverse pour XML:
Il fonctionne correctement avec js2xmlparser.
Il y a une notation JSON /convention badgerfish tentatives pour normalise (au moins ses propres termes) la voie de la préservation de la plupart du faible niveau sémantique XML lorsque le XML DOM représenté sous forme de JSON DOM (avec des attributs bien sûr) (voir http://badgerfish.ning.com/).
De sorte que vous pouvez facilement le transformer à nouveau le badgerfishied-json représentation de la représentation XML et vous continuez à travailler sur la structure XML de votre choix d'outils (pour moi son XPATH /expressions de la REQUÊTE et des outils).
Il est également facile à mémoriser des règles de syntaxe (total 9) comme: "Attributs aller dans les propriétés dont les noms commencent par @". Vous pouvez travailler sur badgerfishied-json dans l'éditeur de texte sans surcharger vos circuits neuronaux inutilement. Habituellement, vous pouvez les mémoriser dans la première passe.
Un exemple de la façon dont YQL présente XML et JSON correspondant. Pas besoin de savoir quelque chose au sujet de YQL à comprendre cela, mais si vous êtes intéressé, vous pouvez vérifier la YQL de la console et de l'essayer vous-même dans le YQL console
XML
JSON
Pourrait être compact dans le JSON trop, attribut est la même que la valeur à l'intérieur de la balise
à partir d'ici:
http://www.json.org/example.html
Le même texte exprimé en XML:
Il me semble que la plus de correspondance exacte entre XML et JSON aurait besoin de représenter un nœud XML comme un triplet (c'est à dire array): [nom, les attributs de la valeur], avec le nom d'une chaîne, les attributs d'un objet avec les noms d'attributs que les clés et les valeurs d'attribut (string) des valeurs, et la valeur d'une chaîne de caractères (pour les valeurs atomiques) ou d'un tableau de ces triplets.
Par exemple la cartographie du JSON-l'équivalent de
serait
En fait l'idée derrière cette cartographie est que:
1) XML-JSON transformation est réversible.
2) Le "frère" de la relation de sous-nœuds être préservée
Dans le même temps, la distinction entre les nœuds de l'attribut et la valeur des nœuds est explicite ici.
T-il un sens? Et elle justifie la complexité dessus?
element-list
: les éléments de la liste semblent être au même niveau quetag-name
etattributes
jetons, alors que dans ma suggestion, uneelement
est toujours un triolet- c'est à dire un tableau de trois éléments; le troisième élément étant une chaîne littérale ou d'un autre élément (triplet)...element
s (tableau de triplets)"modifier
Une méthode similaire est préconisé sur http://www.jsonml.org/. Ils ont inventé le terme json markup language.
Vous pouvez choisir n'importe quelle cartographie vous voulez, mais si vous avez la carte
à
puis comment voulez-vous carte:
Je voudrais faire parti du fait que certains noms d'attribut sont interdits.
Ou plus compex exemple:
pourrait correspondre à:
Les règles de conversion sont sans ambiguïté:
À l'espace sûr, il y a un moyen de unambigously simplifier mentionné cartographie:
Si un élément n'est pas toute attribue, la valeur de l'objet (contenant spécial chaîne vide cartographie d'un tableau) est remplacé par le tableau directement. Ainsi, au lieu de:
{"hOffset":{"":["250",{"l'unité":{"":["mm"]}}]}}
vous obtenez
Si le contenu de l'élément est juste le texte, le tableau contenant la valeur de la chaîne est remplacée par la chaîne de valeur directement, de sorte que vous obtenez:
{"hOffset":["250",{"unité":"mm"}]}
De cette façon, il y aura toujours exactement une sorte de carte de la jml (json markup language) retour à xml (ou html)
JSON est plus uniforme que XML et ne fait pas la distinction entre la plaine-des attributs de texte et hiérarchique du contenu. La représentation naturelle de votre exemple serait
C'est encore plus compact que le respectifs XML.
"contenu" est utilisé pour le texte, tandis que les attributs sont ses frères et sœurs dans l'JSON:
Java détails de mise en œuvre
J'ai couru dans un scénario qui a besoin de XML et JSON pour l'entrée et la sortie sur la base de ce qui est passé. J'ai trouvé un moyen qui fonctionne avec des Attributs XML/Propriétés et JSON. Remarquez maintenant, c'est comment il est codé en Java, permet de travailler de cette façon.
Mon XML Exemple:
Mon JSON Exemple:
Comment je l'ai fait travailler via le code Log.java:
Message.java, Note le @JacksonXmlText ci-dessous, qui est la clé:
Appelant au sein LogController.java:
Si vous souhaitez avoir un aperçu des diverses conventions pour XML en JSON conversion, il y a une belle vue d'ensemble sur: http://wiki.open311.org/JSON_and_XML_Conversion/
Une bibliothèque python qui prend en charge plus d'une convention est xmljson (https://github.com/sanand0/xmljson).
D'ouverture mise en garde: Dans cette réponse, je suis délibérément dans la question d'origine, et l'élargissement de la portée un peu. Parfois poser la question derrière la question que nous avons besoin de regarder la grande image de la première.
Comme tous les animaux sont égaux, toutes les traductions de JSON en XML, et à partir de XML en JSON sont inégales. Il ne peut être mathématiquement correct réponses à cette question, et même si il y a, ils peuvent être faux. Toutes les réponses seront une question d'opinion, et dépendent du exact de cas d'utilisation(s).
JSON et XML à la fois de soutien et d'omettre des concepts qui rendent parfait, réversible et natif de traductions difficile.
Pour en nommer que quelques-uns:
XML nécessite un élément racine. JSON n'est pas.
XML fait la distinction entre les Éléments et les Attributs. Les attributs sont des feuilles, des Éléments peut-être des feuilles ou des branches. Objets JSON sont proches des Éléments, mais n'ont pas d'équivalent direct aux Attributs.
JSON a des tableaux; le plus proche équivalent XML est un Élément parent, mais certaines traductions de tomber sous le coup où il y a un seul élément enfant.
XML a des espaces de noms..... Le moins dit à propos de ces le mieux...
JSON est conçu pour être compact et léger, et est plus proche (à mon humble avis) pour YAML que XML.
Où un concept existe dans la langue source, mais pas dans la langue cible, nous devons être inventifs et créatifs dans notre traduction. Vos cas d'utilisation sont la clé.
par exemple
Sera le résultat en tant que natif du possible dans la langue cible? Aurions-nous le modèle comme ceci JSON? Aurions-nous le modèle comme ceci dans le fichier XML?
Sera le résultat réversible à la source d'origine, même au détriment des “indigènes se sentent”?
Est la compacité des critères? Ce peut être le cas pour JSON sur un élément lourd XML, mais pas pour JSON traduit de l'XML et conçu pour être traduit.
Pour faire une comparaison avec les langues humaines: En Suisse allemande, nous aimons notre diminutives: les Noms sont systématiquement réduites pour le petit formulaire où ce serait étrange en anglais; mais encore plus bizarrly, nous avons diminutives de verbes!
Donc: “wir machen es köchele”, pourrait traduire techniquement à la “nous allons cuisiner littely”, ou “nous faire un peu de cuisine”, mais l'un et l'autre être pauvre et incorrect anglais, et en quelque sorte manquer l'idée.
“nous allons faire un peu de cuisine” ou “nous aurons le plaisir de la cuisine” serait beaucoup plus proche de l'idée originale. Mais je soupçonne que Anthea Bell (d'Asterix-aux-anglais traduction de la gloire) serait vraiment obtenir le point; “nous allons cuisiner un festin....”
Revenir à la question initiale. Python pour les programmeurs ont un concept de pythonesque: = la plupart de montage pour le noyau ethos de python. La réponse par user166390 (la accepté de répondre au moment de cette réponse) qui me frappe le plus JSONesque.
Mon choix pour la représentation XML, afin de vérifier qu'elle en quelque sorte réversible, est comme suit (à l'aide de votre exemple):
se traduit par:
L'aide de l'
@
comme un indicateur de la "attribut" et$t
comme indicateur pour le contenu texte" je peux revenir à la chaîne JSON à un fidèle de la version originelle XML.Un joli Noeud package pour effectuer cette conversion est XML2JSON, bien qu'il ne veut pas faire quelque chose de spécial avec les attributs, et un certain code supplémentaire est nécessaire pour produire cette sortie.
Excluant les noms d'attributs qui sont toujours à la même longueur, JSON sera toujours plus compact que le juste n'ont pas les balises de fermeture 😉