De manière récursive parsing JSON
J'ai un grand objet JSON que j'ai créé avec Python, et je suis besoin pour afficher les informations sur une page web maintenant. Mon problème est la taille de celui-ci; il y a des tableaux imbriqués et les objets à l'intérieur, et il est de plusieurs niveaux de profondeur dans les points. J'ai écrit un très inélégant (et buggy) fonction JavaScript pour tirer les données, mais cela semble être un appel récursif de problème pour moi, et malheureusement, je ne suis pas l'habitude de penser comme ça (encore).
Personne ne sait d'une bonne solution de analyse la lecture d'un tel objet? Mon but ici est vraiment de lire ce peu de façon dynamique, puisque je vais avoir à faire beaucoup plus de fois (et à chaque fois que l'objet sera différent, mais avec plus ou moins de la même structure). L'objectif est de prendre cette information et de montrer de manière significative sur une page web.
Laissez-moi savoir si je peux préciser davantage.
Edit: Voici l'objet. J'étais loin de mon ordinateur quand j'ai posté ceci, en plus il est plutôt grand. Des parties de ce qui pourrait être sensible, je l'ai sorti. Et je suis en utilisant le JSON2 d'analyser ce en autre chose qu'une chaîne de caractères. C'est juste la taille et nestiness c'est de me donner un problème.
{
"Loop300": [
{
"Loop310": [
{
"N1": {
"idCode": "0400",
"idQual": "ZZ",
"name": "REDACTED",
"entIdCode": "SF"
},
"N3": [
{
"address1": "REDACTED",
"address2": "REDACTED"
}
],
"G61": [
{
"contactFunctionCode": "CN",
"commNumber": "REDACTED",
"commNumQualifier": "TE",
"name": "shipping"
}
],
"N4": [
{}
]
}
],
"L11": [],
"S5": {
"stopReasonCode": "LD",
"stopSeqNum": "1"
},
"Loop350": [
{
"LAD": [],
"OID": {
"weight": "161",
"poNum": "ASDF",
"weightCode": "L",
"unitMeasure": "CA",
"refID": "THING",
"quantity": "6"
},
"Loop360": [
{
"Loop365": [],
"L5": {
"lineNum": "1",
"desc": "STUFF"
}
}
]
},
{
"LAD": [],
"OID": {
"weight": "104",
"poNum": "ZXMO",
"weightCode": "L",
"unitMeasure": "CA",
"refID": "STUFF",
"quantity": "6"
},
"Loop360": [
{
"Loop365": [],
"L5": {
"lineNum": "2",
"desc": "STUFF"
}
}
]
},
{
"LAD": [],
"OID": {
"weight": "1833",
"poNum": "ASDF",
"weightCode": "L",
"unitMeasure": "CA",
"refID": "THEBLOB",
"quantity": "40"
},
"Loop360": [
{
"Loop365": [],
"L5": {
"lineNum": "3",
"desc": "STUFF"
}
}
]
},
{
"LAD": [],
"OID": {
"weight": "229",
"poNum": "FDSA",
"weightCode": "L",
"unitMeasure": "CA",
"refID": "BATMAN",
"quantity": "6"
},
"Loop360": [
{
"Loop365": [],
"L5": {
"lineNum": "4",
"desc": "STUFF"
}
}
]
}
],
"AT5": [],
"G62": [
{
"date": "20100817",
"datequalifier": "10"
},
{
"date": "20100817",
"datequalifier": "38"
}
],
"NTE": [
{
"refCode": "OTH",
"desc": "No Touch"
}
]
},
{
"Loop310": [
{
"N1": {
"idCode": "9998000006",
"idQual": "ZZ",
"name": "REDACTED",
"entIdCode": "SF"
},
"N3": [
{
"address1": "REDACTED"
}
],
"G61": [
{
"contactFunctionCode": "CN",
"commNumber": "REDACTED",
"commNumQualifier": "TE",
"name": "REDACTED"
}
],
"N4": [
{}
]
}
],
"L11": [],
"S5": {
"stopReasonCode": "LD",
"stopSeqNum": "2"
},
"Loop350": [
{
"LAD": [],
"OID": {
"poNum": "QWERTY",
"refID": "ASDF",
"unitMeasure": "PL",
"quantity": "1"
},
"Loop360": [
{
"Loop365": [],
"L5": {
"lineNum": "1",
"desc": "PORT"
}
}
]
}
],
"AT5": [],
"G62": [
{
"date": "20100817",
"datequalifier": "10"
},
{
"date": "20100817",
"datequalifier": "38"
}
],
"NTE": [
{
"refCode": "OTH",
"desc": "Driver Count Required"
}
]
},
{
"Loop310": [
{
"N1": {
"idCode": "9998000070",
"idQual": "ZZ",
"name": "PLACE",
"entIdCode": "ST"
},
"N3": [
{
"address1": "PLACE"
}
],
"G61": [
{
"contactFunctionCode": "CN",
"commNumber": "XXXXXXXXXX",
"commNumQualifier": "TE",
"name": "X"
}
],
"N4": [
{}
]
}
],
"L11": [],
"S5": {
"stopReasonCode": "UL",
"stopSeqNum": "3"
},
"Loop350": [
{
"LAD": [],
"OID": {
"poNum": "JOE",
"refID": "SUPERMAN",
"unitMeasure": "PL",
"quantity": "1"
},
"Loop360": [
{
"Loop365": [],
"L5": {
"lineNum": "1",
"desc": "PORT"
}
}
]
}
],
"AT5": [],
"G62": [
{
"date": "20100817",
"datequalifier": "68"
},
{
"date": "20100817",
"datequalifier": "54"
}
],
"NTE": [
{
"refCode": "OTH",
"desc": "No Touch"
}
]
},
{
"Loop310": [
{
"N1": {
"idCode": "0000403803",
"idQual": "ZZ",
"name": "REDACTED",
"entIdCode": "ST"
},
"N3": [
{
"address1": "REDACTED"
}
],
"G61": [
{
"contactFunctionCode": "CN",
"commNumber": "0000000000",
"commNumQualifier": "TE",
"name": "REDACTED"
}
],
"N4": [
{}
]
}
],
"L11": [
{
"qualifier": "DO",
"refID": "THETHING"
}
],
"S5": {
"stopReasonCode": "UL",
"stopSeqNum": "4"
},
"Loop350": [
{
"LAD": [],
"OID": {
"weight": "161",
"poNum": "UIP",
"weightCode": "L",
"unitMeasure": "CA",
"refID": "JACK",
"quantity": "6"
},
"Loop360": [
{
"Loop365": [],
"L5": {
"lineNum": "1",
"desc": "STUFF"
}
}
]
},
{
"LAD": [],
"OID": {
"weight": "104",
"poNum": "JKLM",
"weightCode": "L",
"unitMeasure": "CA",
"refID": "SUSAN",
"quantity": "6"
},
"Loop360": [
{
"Loop365": [],
"L5": {
"lineNum": "2",
"desc": "STUFF"
}
}
]
},
{
"LAD": [],
"OID": {
"weight": "1833",
"poNum": "ASDF",
"weightCode": "L",
"unitMeasure": "CA",
"refID": "JOE",
"quantity": "40"
},
"Loop360": [
{
"Loop365": [],
"L5": {
"lineNum": "3",
"desc": "STUFF"
}
}
]
},
{
"LAD": [],
"OID": {
"weight": "229",
"poNum": "AAAA",
"weightCode": "L",
"unitMeasure": "CA",
"refID": "ASDF",
"quantity": "6"
},
"Loop360": [
{
"Loop365": [],
"L5": {
"lineNum": "4",
"desc": "STUFF"
}
}
]
}
],
"AT5": [],
"G62": [
{
"date": "20100817",
"datequalifier": "68"
},
{
"date": "20100817",
"datequalifier": "54"
}
],
"NTE": [
{
"refCode": "OTH",
"desc": "Driver Assist Required"
}
]
}
],
"SE": {
"numSegments": "70",
"controlNum": "0002"
},
"Loop100BT": [],
"L11": [
{
"qualifier": "VD",
"refID": "SALLY"
},
{
"qualifier": "SI",
"refID": "MARK"
},
{
"qualifier": "CR",
"refID": "JOE"
},
{
"qualifier": "RB",
"refID": "USD"
},
{
"qualifier": "TH",
"refID": "REDACTED"
}
],
"PLD": [],
"L3": {
"weight": "2328",
"advances": "0",
"rateQual": "FR",
"charge": "05",
"freightRate": "",
"weightQual": "G",
"quantity": "59"
},
"B2": {
"ordernum": "12345",
"paymethod": "PP",
"scac": "XXXX"
},
"Loop100VI": [
{
"N1": {
"name": "REDACTED",
"entIdCode": "AA"
},
"G61": [
{
"contactFunctionCode": "CN",
"commNumber": "REDACTED",
"contactReference": "0563",
"commNumQualifier": "TE",
"name": "REDACTED"
},
{
"contactFunctionCode": "IC",
"commNumber": "REDACTED",
"commNumQualifier": "EM",
"name": "REDACTED"
},
{
"contactFunctionCode": "ZZ",
"name": "REDACTED"
}
]
}
],
"G62": [
{
"date": "20100827",
"timequalifier": "1",
"datequalifier": "64",
"time": "1302"
}
],
"Loop100CB": [],
"NTE": [
{
"refCode": "ZZZ",
"desc": "26"
},
{
"refCode": "OTH",
"desc": "No Touch"
},
{
"refCode": "OTH",
"desc": "Driver Count Required"
},
{
"refCode": "OTH",
"desc": "No Touch"
},
{
"refCode": "OTH",
"desc": "Driver Assist Required"
}
],
"B2A": {
"purpose": "00"
},
"N7": [
{
"equipLength": "4800",
"equipHeight": "0",
"weight": "2328",
"equipWidth": "0",
"equipNum": "ZZZZ",
"equipType": "TV",
"weightQual": "G"
}
]
}
Grâce,
T. J.
Does anyone know of a good solution to parsing such an object?
Montrant de l'objet peut aider.Ne pas
JSON.parse()
travail?seulement sur les nouveaux navigateurs. si vous souhaitez dépendent JSON vous sont les suivantes json2.js.
wow mec.. c'est certains json seule une mère pourrait aimer....
OriginalL'auteur tjsimmons | 2010-11-05
Vous devez vous connecter pour publier un commentaire.
faire votre signifie quelque chose comme cela?
Aucune idée si cela fonctionne dans tous les navigateurs, n'en Chrome et firefox
cheers,
Ian
OriginalL'auteur Ian S Williams
Je peux comprendre que vous essayez de faire de votre question plus spécifique, mais il n'y a tout simplement pas assez d'informations.
Le json présenté est extrêmement abstraite, la plupart des clés en déduire que peu ou pas de contexte à la signification des données, la structure est assez vaste de faire l'effort de glaner le sens problématique.
De "significatif" est ambigu, relatif et subjectif terme.
S'il vous plaît essayer de condenser et de clarifier vos données exemplaire et être plus précis dans la façon dont vous proposera de les présenter et vous aurez plus de chance d'obtenir des réponses et des conseils pertinents pour vos besoins.
Acclamations
ceci est ma réponse à la question initialement déclaré
Inclure https://github.com/douglascrockford/JSON-js/blob/master/json2.js dans votre page. Si le navigateur ne prend pas en natif JSON, il va remplir.
puis
roulement de votre propre est juste une chose stupide à faire.
Bonne chance.
alors votre prochaine étape serait de grève le terme "analyser" et de la remplacer avec une description de ce que cette chose utile que vous voulez faire...
Fait et fait. Il était assez tard quand j'ai posté cette nuit dernière et j'avais été à regarder pendant un certain temps. J'ai ajouté ce que je veux faire avec les informations dans le post original.
OriginalL'auteur Sky Sanders
Je dirais JQuery
parseJSON()
function.JQuery mise en œuvre du utiliser le navigateur intégré de
JSON.parse()
fonction, si elle existe, et si non, il va revenir à un pur javascript mise en œuvre.[edit] comme l'a souligné @Sky, le jQuery, la mise en œuvre est beaucoup plus simple que l'implémentation de référence fournis par json.org, et cela pourrait poser problème dans le cas où la source de votre JSON n'est pas forcément digne de confiance.
Mon expérience est que jQuery est un analyseur de sera correctement consommer tout JSON valide (si quelqu'un peut le montrer sinon, j'aimerais beaucoup la voir). Le problème c'est qu'il va aussi consommer un certain nombre de choses que ne sont pas JSON, c'est à dire, il va consommer (et d'évaluation) pour être valable, toute expression javascript. Depuis des expressions pourraient contenir des appels de fonction, ce serait de présenter un problème de sécurité si votre JSON provient d'une source fiable.
Cependant, si la source de votre JSON est digne de confiance (par exemple. votre propre serveur), alors je ne vois aucune raison d'engager les frais généraux supplémentaires (à la fois de la taille du code, et de la performance) de la mise en œuvre stricte. C'est surtout vrai si vous êtes déjà, y compris le jQuery de base pour d'autres raisons (que vous pouvez ou ne pas être).
Bien sûr, tout cela est assez pédant de la discussion, les deux implémentations de l'automne au navigateur intégré, s'il existe, -- dont il dispose dans tous les navigateurs modernes. Mon point est simplement que le jQuery, la mise en œuvre a ses points forts, et est un bon choix dans de nombreux scénarios. Dans d'autres situations, vous pourriez être mieux servis par l'implémentation de référence de json.org.
Pourriez-vous élaborer? Beaucoup de beaucoup de sites et systèmes d'utilisation de jQuery json analyseur de tous les jours. Toute personne qui utilise le jQuery, ajax fonctions est implicitement à l'aide de jQuery json mise en œuvre.
Je serais intéressé aussi bien. JSON n'est pas exactement un complexe de format, j'avais même l'appeler dur pour la mettre en œuvre de manière incorrecte ou incomplète.
et al - jquery va utiliser json native, si présents, si ce n'est qu'elle retombe sur une très naïve de mise en œuvre qui n'est pas sans danger et a souvent des erreurs de traitements parfaitement json valide. tout simplement parce que beaucoup de gens achètent ce qu'ils sont vendus sans se poser de question, c'est à dire 'jquery iz da bomb, duedz', ne confère pas à la capacité de code. je ne suis pas en jetant de l'ombre sur jquery ou ceux qui les utilisent, je le fais régulièrement, mais quand je suis à l'écriture d'applications j'ai besoin de code, je peux compter sur, donc je sauvegarder natif mises en oeuvre avec le code qu'ils étaient à la base, json2.js
et al - en outre, il y a beaucoup documenté des incohérences et des bugs dans le courant natif json implémentations pour lequel j'ai modifier le poli de la nature de json2.js pour remplacer natif stringify et/ou analyse de la problématique des agents utilisateurs.
OriginalL'auteur Lee
Vous pouvez utiliser un JS moteur de template pour transformer votre JSON pour un humainement lisible HTML.
Voici un exemple de récursivité avec la PURE création de modèles lib: http://beebole.com/pure/documentation/recursion-example/
Le modèle ici est tout à fait générique, à l'aide d'un
UL/LI
combinaison.Ou si vous voulez le rendre par exemple dans une zone de texte vous pouvez utiliser
JSON.stringify
:L'appel ci-dessus pour
stringify
tiret du JSON avec 2 places.OriginalL'auteur Mic