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

StackOverflow https://stackoverflow.com/questions/45015

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

Метод jQuery больше не поддерживается.Вместо этого используйте этот метод:

let jsonObject = JSON.parse(jsonString);

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

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

jQuery.parseJSON( jsonString );

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

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

Редактировать:Этот ответ устарел и Ответ Джонатана выше (JSON.parse(jsonString)) теперь лучший ответ.

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

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

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

и обратный

var str = JSON.stringify(arr);

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

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

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

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

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

var data;

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

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

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

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

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

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

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

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

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

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

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

Использование 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);

Самый простой способ использования 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);

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

В 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'
});
JSON.parse(jsonString);

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

Анализ 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 || {};
  }
};

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

JSON.parse(JSON.stringify(object))

Если у нас есть такая строка:"{" 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

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:правда, посчитайте:1}.

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

var obj = JSON.parse(response);

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

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

console.log(obj.result);

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

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

Синтаксис

JSON.parse(text[, reviver])

Параметры

текст

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

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

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

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

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

Исключения

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

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

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

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

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

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

Краткое содержание:

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

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

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

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

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

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

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top