2013-04-19 28 views
8

Mi viene inviata una stringa JSON mal formata da una terza parte. Ho provato a utilizzare JSON.parse(str) per analizzarlo in un oggetto JavaScript, ma ovviamente non è riuscito.Stringa JSON Parse male formata

Il motivo è che le chiavi non sono stringhe:

{min: 100} 

Al contrario di stringa valida JSON (che analizza bene):

{"min": 100} 

ho bisogno di accettare la stringa di formato malati per adesso. Immagino che dimenticare di citare correttamente le chiavi sia un errore comune. C'è un buon modo per cambiare questo in una stringa JSON valida in modo che io possa analizzarlo? Per ora potrei dover analizzare carattere per carattere e provare a formare un oggetto, che suona terribile.

Idee?

+0

Sembra che ci siano alcune soluzioni qui: http://stackoverflow.com/questions/4210160/safely-parsing-a-json-string-with-unquoted-keys?rq=1 – showdev

+0

Penso che usare un costruttore di funzioni dovrebbe funzionare in questo caso: 'var data = new Function ('return' + illFormedJSON;)()' – m90

+1

'(?: [az] +): +' Direi di cercare tutte le chiavi non corrette. Questa non è una regex completa per dovrebbe darti un punto di partenza. Non ho il tempo di rispondere completamente alla domanda. – travis

risposta

5

Si potrebbe semplicemente valutare, ma sarebbe una cattiva pratica di sicurezza se non si fida della fonte. La soluzione migliore sarebbe quella di modificare la stringa manualmente per citare le chiavi o utilizzare uno strumento che qualcun altro ha scritto che fa questo per te (controlla https://github.com/daepark/JSOL scritto da dakark).

+0

utilizzato https://github.com/daepark/JSOL, convertito in un modulo Node.js. – lostintranslation

1

A seconda di cos'altro è presente nel JSON, è sufficiente eseguire una stringa sostitutiva e sostituire '{' con '{"' e ':' con '":'.

2

ho fatto questo solo recentemente, utilizzando Uglifyjs per valutare:

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>'); 

Questo è davvero sciatta in un certo senso, e ha tutti gli stessi problemi di una soluzione eval() in base, ma se hai solo bisogno di analizzare/riformattare i dati una volta, quindi sopra dovrebbe ottenere una copia JSON pulita dell'oggetto JS.

+1

FWIW, questo sarà uno dei modi più lenti per farlo. Uglify è un parser JavaScript completo; manipolare la stringa da soli (ad es. http://stackoverflow.com/a/16110830/444991) sarà * molto * più efficiente. – Matt

+0

Sì, questo approccio è stato progettato per uno script di build in stile Grunt, piuttosto che un'applicazione in tempo reale in cui l'efficienza è una preoccupazione. – BishopZ