Domanda

Data una stringa di dati JSON, come puoi trasformare in sicurezza quella stringa in un oggetto JavaScript?

Ovviamente puoi farlo in modo non sicuro con qualcosa come...

var obj = eval("(" + json + ')');

...ma questo ci lascia vulnerabili alla stringa json contenente altro codice, che sembra molto pericoloso semplicemente valutare.

È stato utile?

Soluzione

JSON.parse(jsonString) è un approccio puramente JavaScript purché tu possa garantire un browser ragionevolmente moderno.

Altri suggerimenti

Il metodo jQuery è ora deprecato.Utilizza invece questo metodo:

let jsonObject = JSON.parse(jsonString);

Risposta originale utilizzando la funzionalità jQuery deprecata:

Se stai usando jQuery usa semplicemente:

jQuery.parseJSON( jsonString );

È esattamente quello che stai cercando (vedi jQuery documentazione).

Modificare:Questa risposta è per IE <7, per i browser moderni controlla la risposta di Jonathan sopra.

Modificare:Questa risposta è obsoleta e La risposta di Jonathan sopra (JSON.parse(jsonString)) è ora il migliore risposta.

JSON.org ha parser JSON per molte lingue, incluse 4 diverse per Javascript.Credo che la maggior parte delle persone prenderebbe in considerazione json2.js la loro implementazione goto.

Utilizzare il codice semplice rappresentato di seguito collegamento su MSDN.

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

e retromarcia

var str = JSON.stringify(arr);

Non sono sicuro di altri modi per farlo, ma ecco come farlo Prototipo (tutorial JSON).

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

Chiamando evalJSON() con true come argomento si pulisce la stringa in entrata.

Questo sembra essere il problema:

Viene ricevuto un input, tramite websocket ajax ecc., e sarà sempre in formato String, ma devi sapere se è JSON.parsable.Il problema è che se lo esegui sempre tramite JSON.parse, il programma POTREBBE continuare "con successo" ma vedrai comunque un errore generato nella console con il temuto "Errore:token inaspettato 'x'".

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

Se stai usando jQuery, puoi anche semplicemente farlo $.getJSON(url, function(data) { });

Quindi puoi fare cose come data.key1.something, data.key1.something_else, eccetera.

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

Al callback vengono passati i dati restituiti, che saranno un oggetto o un array JavaScript come definito dalla struttura JSON e analizzati utilizzando il metodo $.parseJSON() metodo.

Solo per divertimento, ecco come utilizzare la funzione:

 jsonObject = (new Function('return ' + jsonFormatData))()

Prova a utilizzare il metodo con questo oggetto dati.ex:Data='{result:true,count:1}'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

Questo metodo aiuta davvero in Nodejs quando lavori con la programmazione della porta seriale

Usare JSON.parse è probabilmente il modo migliore.Ecco un esempio dimostrazione dal vivo

var jsonRes = '{ "students" : [' +
          '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
          '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
          '{ "firstName":"James" , "lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);

Il modo più semplice di utilizzare parse() metodo:

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

quindi puoi ottenere i valori di Json elementi, ad esempio:

var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;

Utilizzando jQuery come descritto nel documentazione:

JSON.parse(jsonString);

Ho trovato un modo "migliore":

In CoffeeScript:

try data = JSON.parse(jqxhr.responseText)
data ||= { message: 'Server error, please retry' }

In Javascript:

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});
JSON.parse(jsonString);

json.parse cambierà in oggetto.

L'analisi JSON è sempre una seccatura.Se l'input non è quello previsto, genera un errore e blocca ciò che stai facendo.Puoi utilizzare la seguente piccola funzione per analizzare in sicurezza il tuo input.Trasforma sempre un oggetto anche se l'input non è valido o è già un oggetto, il che è meglio nella maggior parte dei casi.

JSON.safeParse = function (input, def) {
  // Convert null to empty object
  if (!input) {
    return def || {};
  } else if (Object.prototype.toString.call(input) === '[object Object]') {
    return input;
  }
  try {
    return JSON.parse(input);
  } catch (e) {
    return def || {};
  }
};

Convertire l'oggetto in JSON e quindi analizzarlo funziona per me, come:

JSON.parse(JSON.stringify(object))

Se abbiamo una stringa come questa:"{" status ": 1, " token ": " 65b4352b2dfc4957a09add0ce5714059 "}" Quindi possiamo semplicemente usare json.parse due volte per convertire questa stringa in un oggetto JSON:

var sampleString = "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
var jsonString= JSON.parse(sampleString)
var jsonObject= JSON.parse(jsonString)

E semplicemente possiamo estrarre valori dall'oggetto JSON usando:

    // instead of last JSON.parse:
    var { status, token } = JSON.parse(jsonString);

Il risultato sarà:

status = 1 and token = 65b4352b2dfc4957a09add0ce5714059

JSON.parse() converte qualsiasi stringa JSON passata nella funzione in un oggetto JSON.

Per una migliore comprensione, premi F12 per aprire Ispeziona elemento del tuo browser e vai alla console per scrivere i seguenti comandi:-

var response = '{"result":true,"count":1}'; //sample json object(string form)
JSON.parse(response); //converts passed string to JSON Object.

Ora esegui il comando: -

console.log(JSON.parse(response));

otterrai un output come Oggetto {risultato:vero, conta:1}.

Per utilizzare quell'oggetto, puoi assegnarlo alla variabile diciamo obj: -

var obj = JSON.parse(response);

Ora utilizzando l'operatore obj e punto(.) puoi accedere alle proprietà dell'oggetto JSON.

Prova a eseguire il comando

console.log(obj.result);

Documentato ufficialmente:

IL JSON.parse() Il metodo analizza una stringa JSON, costruendo il valore JavaScript o l'oggetto descritto dalla stringa.Un facoltativo reviver può essere fornita la funzione per eseguire una trasformazione sull'oggetto risultante prima che venga restituito.

Sintassi

JSON.parse(text[, reviver])

Parametri

testo

La stringa da analizzare come JSON.Consulta l'oggetto JSON per una descrizione della sintassi JSON.

rianimatore (facoltativo)

Se si tratta di una funzione, prescrive come viene trasformato il valore originariamente prodotto dall'analisi, prima di essere restituito.

Valore di ritorno

L'oggetto corrispondente al testo JSON specificato.

Eccezioni

Genera un'eccezione SyntaxError se la stringa da analizzare non è un JSON valido.

Puoi anche usare reviver funzione per filtrare.

var data = JSON.parse(jsonString, function reviver(key, value) {
   //your code here to filter
});

per maggiori informazioni leggere JSON.parse

Domanda più vecchia, lo so, tuttavia nessuno nota questa soluzione utilizzando new Function(), una funzione anonima che restituisce i dati.


Solo un esempio:

 var oData = 'test1:"This is my object",test2:"This is my object"';

 if( typeof oData !== 'object' )
  try {
   oData = (new Function('return {'+oData+'};'))();
  }
  catch(e) { oData=false; }

 if( typeof oData !== 'object' )
  { alert( 'Error in code' ); }
 else {
        alert( oData.test1 );
        alert( oData.test2 );
      }

Questo è un po' più sicuro perché viene eseguito all'interno di una funzione e non viene compilato direttamente nel codice.Quindi, se al suo interno è presente una dichiarazione di funzione, non sarà associata all'oggetto finestra predefinito.

Lo uso per "compilare" le impostazioni di configurazione degli elementi DOM (ad esempio l'attributo data) in modo semplice e veloce.

Analizza la stringa json con JSON.parse() e i dati diventano un oggetto JavaScript.

JSON.parse(jsonString)

Qui, JSON rappresenta l'elaborazione del set di dati JSON.

Esempio, immagina di aver ricevuto questo testo da un server Web:

'{ "name":"John", "age":30, "city":"New York"}'

Per analizzare l'oggetto json:

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}'); 

Qui obj è il rispettivo oggetto JSON che assomiglia al seguente.

{ "name":"John", "age":30, "city":"New York"}

Per recuperare il valore utilizzato .operatore Esempio:

obj.name // John
obj.age //30

Per trasferire il contrario, converti un oggetto JavaScript in una stringa con JSON.stringify().

Riepilogo:

Javascript (sia browser che NodeJS) hanno un file integrato JSON oggetto.Su questo oggetto ci sono 2 metodi convenienti da gestire JSON.Sono i seguenti:

  1. JSON.parse() Prende JSON come argomento, restituisce l'oggetto JS
  2. JSON.stringify() Accetta l'oggetto JS come argomento restituito JSON oggetto

Altre applicazioni:

Inoltre per affrontarlo in modo molto conveniente JSON possono essere utilizzati per altri mezzi.La combinazione di entrambi JSON I metodi ci consentono di rendere molto semplice la creazione di cloni profondi di array o oggetti.Per esempio:

let arr1 = [1, 2, [3 ,4]];
let newArr = arr1.slice();

arr1[2][0] = 'changed'; 
console.log(newArr); // not a deep clone

let arr2 = [1, 2, [3 ,4]];
let newArrDeepclone = JSON.parse(JSON.stringify(arr2));

arr2[2][0] = 'changed'; 
console.log(newArrDeepclone); // A deep clone, values unchanged

Se il tuo JavaScript è presente Mootools IL JSON.parse sarà anonimo dal Framework.
Un valido sintassi Deve trasformare in sicurezza una stringa JSON in un oggetto deve essere:

var object = JSON.decode(string[, secure]);

Inoltre a JSON Request può sollevare un oggetto in grado di analizzare direttamente.
Puoi controllare come gira a dati grezzi json Qui:

http://jsfiddle.net/chetabahana/qbx9b5pm/

Prova questo.Questo è scritto in dattiloscritto.

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top