Veilig een JSON-tekenreeks in een object veranderen

Gegeven een reeks JSON-gegevens, hoe kan ik die reeks veilig in een JavaScript-object veranderen?

Natuurlijk kan ik dit onveilig doen met zoiets als:

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

maar dat maakt me kwetsbaar voor de JSON-string die andere code bevat, wat erg gevaarlijk lijkt om gewoon te evalueren.


Antwoord 1, autoriteit 100%

JSON.parse(jsonString)is een pure JavaScript-aanpak zolang je een redelijk moderne browser kunt garanderen.


Antwoord 2, autoriteit 43%

De jQuery-methode is nu verouderd. Gebruik in plaats daarvan deze methode:

let jsonObject = JSON.parse(jsonString);

Oorspronkelijk antwoord met verouderde jQuery-functionaliteit:

Als je jQuery gebruikt, gebruik dan gewoon:

jQuery.parseJSON( jsonString );

Het is precies wat u zoekt (zie de jQuery documentatie).


Antwoord 3, autoriteit 8%

Dit antwoord is voor IE < 7, voor moderne browsers, check Jonathan’s antwoord hierboven.

Dit antwoord is verouderd en Jonathan’s antwoord hierboven(JSON.parse(jsonString)) is nu het beste antwoord.

JSON.orgheeft JSON-parsers voor veel talen, waaronder vier verschillende voor JavaScript. Ik denk dat de meeste mensen json2.jshun goto-implementatie zouden overwegen.


Antwoord 4, autoriteit 4%

Gebruik het eenvoudige codevoorbeeld in “JSON.parse()“:

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

en terugdraaien:

var str = JSON.stringify(arr);

Antwoord 5

Dit lijkt het probleem te zijn:

Een invoer die wordt ontvangen via Ajax-websocket enz., en zal in String-indeling zijn, maar u moet weten of het JSON.parsableis. Het probleem is dat als je het altijd door JSON.parsevoert, het programma KAN doorgaan met “succesvol” maar je zult nog steeds een fout in de console zien met de gevreesde "Error: unexpected token 'x'".

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

Antwoord 6

Ik weet niet zeker wat andere manieren zijn om het te doen, maar hier is hoe je het doet in Prototype (JSON zelfstudie).

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

Door evalJSON()aan te roepen met true als argument, wordt de binnenkomende string gezuiverd.


Antwoord 7

Als je jQuerygebruikt, kun je ook het volgende gebruiken:

$.getJSON(url, function(data) { });

Dan kun je dingen doen als

data.key1.something
data.key1.something_else

enz.


Antwoord 8

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

De callback wordt doorgegeven aan de geretourneerde gegevens, die een JavaScript-object of -array zullen zijn zoals gedefinieerd door de JSON-structuur en geparseerd met behulp van de $.parseJSON()-methode.


Antwoord 9

Voor de lol, hier is een manier om een functie te gebruiken:

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

Antwoord 10

Het gebruik van JSON.parseis waarschijnlijk de beste manier.

Hier is een voorbeeld

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

Antwoord 11

Probeer de methode met dit Data-object te gebruiken. vb:Data='{result:true,count:1}

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

Deze methode helpt echt in Nodejs wanneer je werkt met seriële poortprogrammering


Antwoord 12

De gemakkelijkste manier om de parse()methode te gebruiken:

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

Dan kun je de waarden van de JSON-elementen krijgen, bijvoorbeeld:

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

Gebruik jQueryzoals beschreven in de jQuery.parseJSON()documentatie:

JSON.parse(jsonString);

Antwoord 13

Ik heb een “betere” manier gevonden:

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

Antwoord 14

JSON-parsing is altijd lastig. Als de invoer niet is zoals verwacht, wordt er een fout gegenereerd en crasht wat u aan het doen bent.

U kunt de volgende kleine functie gebruiken om uw invoer veilig te ontleden. Het maakt altijd een object, zelfs als de invoer niet geldig is of al een object is dat voor de meeste gevallen beter is:

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 || {};
  }
};

Antwoord 15

JSON.parse(jsonString);

json.parse zal veranderen in object.


Antwoord 16

Als we een reeks hebben als deze:

"{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"

Dan kunnen we eenvoudig JSON.parsegebruiken om deze string naar een JSON-object te converteren:

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

en we kunnen waarden uit het JSON-object extraheren met:

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

Het resultaat is:

status = 1 and token = 65b4352b2dfc4957a09add0ce5714059

Antwoord 17

JSON.parse()Converteert elke JSON-string die in de functie in een JSON-object wordt geleid.

Om het beter te begrijpen, drukt u op F12om “Inspect Element” in uw browser te openen en gaat u naar de console om de volgende opdrachten te schrijven:

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

Voer nu het commando uit:

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

Je krijgt output als een Object {result: true, count: 1}.

Om dat object te gebruiken, kunt u het toewijzen aan de variabele, misschien obj:

var obj = JSON.parse(response);

Door objen de punt (.) operator te gebruiken, krijgt u toegang tot eigenschappen van het JSON-object.

Probeer de opdracht uit te voeren:

console.log(obj.result);

Antwoord 18

Officiële documentatie:

De methode JSON.parse()parseert een JSON-tekenreeks, waarbij de JavaScript-waarde of het object wordt geconstrueerd dat door de tekenreeks wordt beschreven. Er kan een optionele functie reviverworden geleverd om een transformatie op het resulterende object uit te voeren voordat het wordt geretourneerd.

Syntaxis:

JSON.parse(text[, reviver])

Parameters:

text
: De tekenreeks die moet worden geparseerd als JSON. Zie het JSON-object voor een beschrijving van de JSON-syntaxis.

reviver (optional)
: Als het een functie is, schrijft dit voor hoe de waarde die oorspronkelijk door ontleding is geproduceerd, wordt getransformeerd voordat deze wordt geretourneerd.

Teruggave

Het object dat overeenkomt met de opgegeven JSON-tekst.

Uitzonderingen

Gooit een SyntaxError-uitzondering als de te ontleden string geen geldige JSON is.


Antwoord 19

Het object converteren naar JSON en het vervolgens parseren, werkt voor mij, zoals:

JSON.parse(JSON.stringify(object))

Antwoord 20

Ontleed de JSON-tekenreeks met JSON.parse()en de gegevens worden een JavaScript-object:

JSON.parse(jsonString)

Hier staat JSON voor het verwerken van JSON-dataset.

Stel je voor dat we deze tekst van een webserver hebben ontvangen:

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

Om te parseren in een JSON-object:

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

Hier is objhet respectievelijke JSON-object dat eruitziet als:

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

Gebruik de operator .om een waarde op te halen:

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

Converteer een JavaScript-object in een string met JSON.stringify().


Antwoord 21

Alleen om de dekking te ontleden voor verschillende invoertypes

Ontleed de gegevens met JSON.parse(), en de gegevens worden een JavaScript-object.

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

Bij gebruik van JSON.parse() op een JSON die is afgeleid van een array, retourneert de methode een JavaScript-array in plaats van een JavaScript-object.

var myArr = JSON.parse(this.responseText);
console.log(myArr[0]);

Datumobjecten zijn niet toegestaan in JSON.
Doe voor dates zoiets als dit

var text = '{ "name":"John", "birth":"1986-12-14", "city":"New York"}';
var obj = JSON.parse(text);
obj.birth = new Date(obj.birth);

Functies zijn niet toegestaan in JSON.
Als u een functie moet opnemen, schrijft u deze als een tekenreeks.

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

Antwoord 22

Oudere vraag, ik weet het, maar niemand merkt deze oplossing op door new Function()te gebruiken, een anonieme functie die de gegevens retourneert.


Gewoon een voorbeeld:

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

Dit is een beetje veiliger omdat het in een functie uitvoert en niet rechtstreeks in uw code compileren. Dus als er een functieverklaring erin is, is het niet gebonden aan het standaardvensterobject.

Ik gebruik dit om configuratie-instellingen van DOM-elementen te ‘compileren “(bijvoorbeeld het gegevenskenmerk) eenvoudig en snel.


Antwoord 23

SAMENVATTING:

JavaScript (zowel browser als nodejs) hebben een ingebouwde JSONObject. Op dit object zijn 2 handige methoden voor het omgaan met JSON. Zij zijn de volgende:

  1. JSON.parse()Neemt JSONALS ARGUMENT, RETURNT JS Object
  2. JSON.stringify()neemt JS-object als argument Retourneert JSONObject

Andere toepassingen:

Bovendien voor zeer handig omgaan met JSONze kunnen voor andere middelen worden gebruikt. De combinatie van zowel JSONMethods stelt ons in staat om zeer gemakkelijk te maken, diepe klonen van arrays of objecten. Bijvoorbeeld:

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

Antwoord 24

U kunt ook reviver-functie gebruiken om te filteren.

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

Lees voor meer informatie JSON.parse.


Antwoord 25

Prestaties

Er is al een goed antwoord op deze vraag, maar ik was benieuwd naar de prestaties en vandaag 2020.09.21 voer ik tests uit op MacOs HighSierra 10.13.6 op Chrome v85, Safari v13.1.2 en Firefox v80 voor gekozen oplossingen.

Resultaten

  • eval/Function(A,B,C)-aanpak is snel in Chrome (maar voor groot-diep object N=1000 crashen ze: “maximum stack call overschrijden)
  • eval(A) is snel/gemiddeld snel in alle browsers
  • JSON.parse(D,E) zijn het snelst in Safari en Firefox

Details

Ik voer 4 testgevallen uit:

  • voor klein ondiep object HIER
  • voor klein diep object HIER
  • voor groot ondiep object HIER
  • voor groot diep object HIER

Object dat in bovenstaande tests is gebruikt, kwam van HIER


Antwoord 26

Probeer dit. Deze is in typoscript geschreven.

        export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }

Antwoord 27

/**
 * Safely turning a JSON string into an object
 *
 * @param {String} str - JSON String
 * @returns deserialized object, false if error
 */
export function jsonParse(str) {
  let data = null;
  try {
    data = JSON.parse(str);
  } catch (err) {
    return false;
  }
  return data;
}

Other episodes