Безопасное превращение строки JSON в объект - PullRequest
1251 голосов
/ 05 сентября 2008

Учитывая строку данных JSON, как вы можете безопасно превратить эту строку в объект JavaScript?

Очевидно, что вы можете сделать это небезопасно с чем-то вроде ...

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

... но это делает нас уязвимыми для строки json, содержащей другой код, который кажется очень опасным для простого вычисления.

Ответы [ 25 ]

7 голосов
/ 22 апреля 2015

Использование JSON.parse, вероятно, лучший способ. Вот пример живая демка

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);
7 голосов
/ 20 февраля 2016

Самый простой способ, используя parse() метод:

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

тогда вы можете получить значения элементов Json, например:

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

Использование jQuery , как описано в документации :

JSON.parse(jsonString);
4 голосов
/ 18 февраля 2015

Я нашел «лучший» способ:

В CoffeeScript:

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

В Javascript:

var data;

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

data || (data = {
  message: 'Server error, please retry'
});
2 голосов
/ 15 марта 2019

Если у нас есть такая строка: "{\" Статус \ ": 1, \" токен \ ": \" 65b4352b2dfc4957a09add0ce5714059 \ "}" тогда мы можем просто дважды использовать JSON.parse для преобразования этой строки в объект JSON:

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

И просто мы можем извлечь значения из объекта JSON, используя:

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

Результат будет:

status = 1 and token = 65b4352b2dfc4957a09add0ce5714059
2 голосов
/ 19 июня 2017

Преобразование объекта в JSON, а затем его разбор работает для меня, например:

JSON.parse(JSON.stringify(object))
2 голосов
/ 14 февраля 2017

Разбор JSON - это всегда боль в заднице. Если ввод не такой, как ожидалось, он выдает ошибку и вылетает, что вы делаете. Вы можете использовать следующую крошечную функцию для безопасного анализа вашего ввода. Он всегда поворачивает объект, даже если ввод неправильный или уже является объектом, что лучше для большинства случаев.

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 || {};
  }
};
2 голосов
/ 19 декабря 2016
JSON.parse(jsonString);

json.parse превратится в объект.

1 голос
/ 20 декабря 2017

Официально задокументировано :

Метод JSON.parse() анализирует строку JSON, создавая значение JavaScript или объект, описываемый строкой. Может быть предоставлена ​​необязательная функция reviver для выполнения преобразования результирующего объекта до его возвращения.

Синтаксис

JSON.parse(text[, reviver])

Параметры

текст

Строка для анализа в формате JSON. См. Объект JSON для описания синтаксиса JSON.

reviver (опционально)

Если функция, это предписывает, как преобразовать значение, первоначально произведенное при синтаксическом анализе, перед возвратом.

Возвращаемое значение

Объект, соответствующий заданному тексту JSON.

Исключения

Выдает исключение SyntaxError, если строка для анализа недопустима JSON.

1 голос
/ 03 декабря 2016

JSON.parse () преобразует любую строку JSON, переданную в функцию, в объект JSON.

Для лучшего понимания нажмите F12, чтобы открыть Inspect Element вашего браузера и перейти к консоли, чтобы написать следующие команды: -

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

Теперь запустите команду: -

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

вы получите вывод как Object {result: true, count: 1}.

Чтобы использовать этот объект, вы можете присвоить его переменной, скажем, obj: -

var obj = JSON.parse(response);

Теперь с помощью оператора obj и точки (.) Вы можете получить доступ к свойствам объекта JSON.

Попробуйте запустить команду

console.log(obj.result);
0 голосов
/ 18 августа 2018

Резюме:

Javascript (как браузер, так и NodeJS) имеют встроенный объект JSON. На этом объекте есть 2 удобных метода для работы с JSON. Они следующие:

  1. JSON.parse() Принимает JSON в качестве аргумента, возвращает объект JS
  2. JSON.stringify() Принимает объект JS в качестве аргумента и возвращает JSON объект

Другие приложения:

Кроме того, для очень удобного обращения с JSON они могут использоваться для других целей. Сочетание обоих методов JSON позволяет нам очень легко создавать глубокие клоны массивов или объектов. Например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...