Безопасное превращение строки JSON в объект

javascript json

1200640 просмотра

25 ответа

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

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

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

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

Автор: Matt Sheppard Источник Размещён: 29.07.2019 02:48

Ответы (25)


1864 плюса

Решение

JSON.parse(jsonString) это чистый подход JavaScript, если вы можете гарантировать достаточно современный браузер.

Автор: Jonathan. Размещён: 16.04.2011 11:45

868 плюса

Метод jQuery устарел. Используйте этот метод вместо:

let jsonObject = JSON.parse(jsonString);

Исходный ответ с использованием устаревшей функциональности jQuery :

Если вы используете jQuery, просто используйте:

jQuery.parseJSON( jsonString );

Это именно то, что вы ищете (см. Документацию jQuery ).

Автор: Alex V Размещён: 02.09.2010 02:07

151 плюса

Изменить: Этот ответ для IE <7, для современных браузеров проверьте ответ Джонатана выше.

Изменить: Этот ответ устарел, и ответ Джонатана выше ( JSON.parse(jsonString)) теперь является лучшим ответом .

JSON.org имеет парсеры JSON для многих языков, включая 4 различных для Javascript. Я считаю, что большинство людей считают json2.js своей реализацией.

Автор: John Размещён: 05.09.2008 12:13

68 плюса

Используйте простой код, представленный в следующей ссылке на MSDN .

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

и обратный

var str = JSON.stringify(arr);
Автор: Ronald Размещён: 15.12.2013 11:26

20 плюса

Я не уверен насчет других способов сделать это, но вот как вы это делаете в Prototype (учебник по JSON) .

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

Вызов evalJSON () с true в качестве аргумента очищает входящую строку.

Автор: Mark Biek Размещён: 05.09.2008 12:13

19 плюса

Это, кажется, проблема:

Ввод получен через ajax websocket и т. Д., И он всегда будет в формате String - но вам нужно знать, является ли он JSON.parsable. Двойным является то, что, если вы всегда запускаете его через JSON.parse, программа МОЖЕТ продолжить «успешно», но вы все равно увидите ошибку, выданную в консоли с страшным «Ошибка: неожиданный токен« x »».

var data;

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

data || (data = {
  message: 'Server error, please retry'
});
Автор: Cody Размещён: 29.04.2013 07:37

14 плюса

Если вы используете JQuery , вы также можете просто сделать$.getJSON(url, function(data) { });

Тогда вы можете делать такие вещи, как data.key1.something, data.key1.something_elseи т. Д.

Автор: Leanan Размещён: 24.10.2008 01:57

12 плюса

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

Обратному вызову передаются возвращенные данные, которые будут объектом или массивом JavaScript, как определено структурой JSON, и проанализированы с использованием $.parseJSON()метода.

Автор: Prahlad Размещён: 06.05.2010 06:23

10 плюса

Просто для удовольствия, вот способ использования функции:

 jsonObject = (new Function('return ' + jsonFormatData))()
Автор: lessisawesome Размещён: 15.10.2014 08:11

8 плюса

Попробуйте использовать метод с этим объектом данных. например: Data='{result:true,count:1}'

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

Этот метод действительно помогает в Nodejs, когда вы работаете с программированием последовательного порта

Автор: GPrathap Размещён: 15.07.2014 06:53

7 плюса

Использование 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);
Автор: Bharath Kumaar Размещён: 22.04.2015 09:40

7 плюса

Самый простой способ с использованием 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);
Автор: Jorgesys Размещён: 20.02.2016 01:00

4 плюса

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

В 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'
});
Автор: Dorian Размещён: 18.02.2015 01:38

2 плюса

JSON.parse(jsonString);

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

Автор: Shekhar Tyagi Размещён: 19.12.2016 01:05

2 плюса

Разбор 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 || {};
  }
};
Автор: Tahsin Turkoz Размещён: 14.02.2017 08:47

2 плюса

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

JSON.parse(JSON.stringify(object))
Автор: Liuver Reynier Durán Pérez Размещён: 19.06.2017 04:28

2 плюса

Если у нас есть такая строка: "{\" status \ ": 1, \" token \ ": \" 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
Автор: Hamid Araghi Размещён: 15.03.2019 08:15

1 плюс

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 и dot (.) Вы можете получить доступ к свойствам объекта JSON.

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

console.log(obj.result);
Автор: Pushkar Kathuria Размещён: 03.12.2016 03:32

1 плюс

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

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

Синтаксис

JSON.parse(text[, reviver])

параметры

текст

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

оживить (необязательно)

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

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

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

Исключения

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

Автор: Salomon Zhang Размещён: 20.12.2017 01:47

0 плюса

Вы также можете использовать reviverфункцию для фильтрации.

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

для получения дополнительной информации читайте JSON.parse

Автор: Durgpal Singh Размещён: 26.07.2017 08:58

0 плюса

Я знаю, что это более старый вопрос, однако никто не замечает этого решения, используя new Function()анонимную функцию, которая возвращает данные.


Просто пример:

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

Это немного более безопасно, потому что он выполняется внутри функции и не компилируется в вашем коде напрямую. Поэтому, если внутри него есть объявление функции, оно не будет привязано к объекту окна по умолчанию.

Я использую это для простой и быстрой «компиляции» настроек конфигурации элементов DOM (например, атрибута данных).

Автор: Codebeat Размещён: 19.02.2018 01:27

0 плюса

Разобрать строку json с помощью JSON.parse (), и данные станут объектом JavaScript.

JSON.parse(jsonString)

Здесь JSON представляет для обработки набора данных json.

Пример. Представьте, что мы получили этот текст с веб-сервера:

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

Разобрать в объект json:

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

Здесь obj - это соответствующий объект JSON, который выглядит следующим образом.

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

Для получения значения используется. Пример оператора:

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

Чтобы передать противоположное, преобразуйте объект JavaScript в строку с помощью JSON.stringify ().

Автор: Amitesh Размещён: 13.08.2018 02:33

0 плюса

Резюме:

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

Автор: Willem van der Veen Размещён: 18.08.2018 10:00

-1 плюса

Если ваш JavaScript находится в Mootools, то платформа JSON.parseбудет анонимной.
Действительный синтаксис для безопасного превращения строки JSON в объект должен быть:

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

Более того, это JSON Requestможет поднять объект, который может анализировать напрямую.
Вы можете посмотреть, как получаются необработанные данные в формате json :

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

Автор: Chetabahana Размещён: 11.05.2018 07:27

-1 плюса

Попробуйте это. Это написано в машинописи.

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }
Автор: Supun Dharmarathne Размещён: 30.05.2018 06:31
Вопросы из категории :
32x32