8
votes

Analyser la chaîne JSON formée malade

Je suis envoyé une chaîne de Json formée malade d'un tiers. J'ai essayé d'utiliser json.parse (str) code> pour l'analyser dans un objet JavaScript, mais bien sûr échoué.

La raison en est que les clés ne sont pas des cordes: P>

{"min": 100}


9 commentaires

On dirait qu'il y a des solutions ici: Stackoverflow.com/Questtions/4210160/...


Je pense que l'utilisation d'un constructeur de fonctions devrait fonctionner dans ce cas: var données = nouvelle fonction ("retour" + illformedjson;) ()


(?: [A-Z] +): + Je dirais que je dirais toutes les clés non appropriées. Ce n'est pas une regex complète pour vous donner un endroit pour commencer. N'ayez pas le temps de répondre pleinement à la question.


@ m90 n'est-ce pas si eval déguisé? Que diriez-vous d'un Json comme: {A: alerte ('whoa!')}


@Thrustmaster L'OP a déclaré que les touches ne sont pas citées, pas les valeurs. De toute façon, vous avez raison, c'est un cas particulier de eval qui exécuterait n'importe quel JavaScript dans la chaîne principale


C'est assez vrai, mais je ne connais pas les circonstances exactes de cela et lorsque l'OP dit qu'il doit faire face à un Json malformé, vous devrez trouver une sorte de solution de contournement qui est semi-idéal. Si cela provient d'une API «digne de confiance» mais mal formée, je ne voudrais pas utiliser Regexp-analysant en quelque sorte les chaînes mal formées. Si cela s'occupe de la saisie de l'utilisateur, cela serait un non-go, c'est sûr.


Il n'y a pas de malformé JSON. Si c'est mal formé, ce n'est pas Json.


Wow merci pour l'aperçu Kolink. Un code d'écriture jamais qui ne compile pas ..... c'est pas vraiment du code. N'a pas vraiment pensé que le titre, je ne peux pas analyser Json dans JS Object obtiendrait de nombreux hits. ' Tu sais ce que je voulais dire.


BTW, Github.com/daepark/jsol fonctionne bien. Essayez quelque chose {A: alerte ('whoa!')}. Gère bien cela, tout comme Json Lib.


3 Réponses :


1
votes

Selon ce qui est d'autre dans le JSON, vous pouvez simplement faire une chaîne remplacer et remplacer '{' avec '{"' ':' avec '":' .


0 commentaires

5
votes

Vous pouvez simplement évaluer, mais ce serait une mauvaise pratique de sécurité si vous ne faites pas confiance à la source. Une meilleure solution serait de modifier la chaîne manuellement pour citer les clés ou utiliser un outil que quelqu'un d'autre a écrit qui le fait pour vous (consultez https://github.com/daepark/jsol écrit par Daepark).


0 commentaires

2
votes

Je l'ai fait juste récemment, en utilisant uglifyjs pour évaluer:

var jsp = require("uglify-js").parser;
var pro = require("uglify-js").uglify;

var orig_code = "var myobject = " + badJSONobject;
var ast = jsp.parse(orig_code); // parse code and get the initial AST
var final_code = pro.gen_code(ast); // regenerate code

$('head').append('<script>' + final_code + '; console.log(JSON.stringify(myobject));</script>');


2 commentaires

FWIW, ce sera l'un des moyens les plus lents de le faire. Uglify est un analyseur JavaScript époustouflé complet; Manipuler la chaîne vous-même (par exemple, Stackoverflow.com/a/16110830/444991 ) sera beaucoup plus efficace.


Oui, cette approche a été conçue pour un script de construction de style grognant plutôt qu'une application en temps réel où l'efficacité est une préoccupation.