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

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

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

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

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

1145
задан Matt Sheppard 05 сент. '08 в 3:12
источник поделиться
26 ответов

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

1735
ответ дан Jonathan. 16 апр. '11 в 14:45
источник поделиться

Метод jQuery теперь устарел. Вместо этого используйте этот метод:

let jsonObject = JSON.parse(jsonString);

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

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

jQuery.parseJSON( jsonString );

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

860
ответ дан Alex V 02 сент. '10 в 17:07
источник поделиться

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

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

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

140
ответ дан John 05 сент. '08 в 3:13
источник поделиться

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

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

и наоборот

var str = JSON.stringify(arr);
62
ответ дан Ronald 16 дек. '13 в 2:26
источник поделиться

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

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

Вызов evalJSON() с true, поскольку аргумент дезинфицирует входящую строку.

18
ответ дан Mark Biek 05 сент. '08 в 3:13
источник поделиться

Кажется, это проблема:

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

var data;

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

data || (data = {
  message: 'Server error, please retry'
});
15
ответ дан Cody 29 апр. '13 в 10:37
источник поделиться

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

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

11
ответ дан Leanan 24 окт. '08 в 16:57
источник поделиться
$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

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

10
ответ дан Prahlad 06 мая '10 в 9:23
источник поделиться

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

 jsonObject = (new Function('return ' + jsonFormatData))()
9
ответ дан lessisawesome 15 окт. '14 в 11:11
источник поделиться

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

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

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

8
ответ дан GPrathap 15 июля '14 в 21:53
источник поделиться

Самый простой способ с использованием метода 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);
6
ответ дан Jorgesys 20 февр. '16 в 4:00
источник поделиться

Я успешно использовал json_sans_eval некоторое время. По словам его автора, он более безопасен, чем json2.js.

5
ответ дан teleclimber 07 дек. '10 в 1:34
источник поделиться

Использование 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);
5
ответ дан Bharath Kumaar 22 апр. '15 в 12:40
источник поделиться

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

В 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'
});
3
ответ дан Dorian 18 февр. '15 в 16:38
источник поделиться

Разбор 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 || {};
  }
};
1
ответ дан Tahsin Turkoz 14 февр. '17 в 23:47
источник поделиться

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

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

Синтаксис

JSON.parse(text[, reviver])

параметры

текст

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

reviver (необязательно)

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

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

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

Исключения

Выдает исключение SyntaxError, если строка для разбора недействительна JSON.

1
ответ дан Salomon Zhang 20 дек. '17 в 4:47
источник поделиться

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

JSON.parse(JSON.stringify(object))
1
ответ дан Liuver Reynier Durán Pérez 19 июня '17 в 19:28
источник поделиться
JSON.parse(jsonString);

json.parse изменится на объект.

1
ответ дан Shekhar Tyagi 19 дек. '16 в 16:05
источник поделиться

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}.

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

var obj = JSON.parse(response);

Теперь, используя оператор obj и dot (.), вы можете получить доступ к свойствам объекта JSON.

Попробуйте выполнить команду

console.log(obj.result);
1
ответ дан Pushkar Kathuria 03 дек. '16 в 18:32
источник поделиться

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

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

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

0
ответ дан Durgpal Singh 26 июля '17 в 11:58
источник поделиться

Более старый вопрос, я знаю, однако никто не замечает этого решения, используя 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 (например, атрибута данных) простым и быстрым.

0
ответ дан Codebeat 19 февр. '18 в 4:27
источник поделиться

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

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }
0
ответ дан Supun Dharmarathne 30 мая '18 в 9:31
источник поделиться

JS Guru Douglas Crockford написал функцию parseJSON, которую вы скачать здесь

0
ответ дан Manu 05 сент. '08 в 3:47
источник поделиться

Разделите строку 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().

0
ответ дан FullStack 13 авг. '18 в 5:33
источник поделиться

Резюме:

Javascript (как браузер, так и NodeJS) имеет встроенный объект JSON. На этом объекте есть два удобных метода работы с 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
0
ответ дан Willem van der Veen 18 авг. '18 в 13:00
источник поделиться

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

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

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

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

-1
ответ дан Chetabahana 11 мая '18 в 22:27
источник поделиться

Другие вопросы по меткам