15

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

14

У меня есть строка с данными в формате JSON, и я ищу безопасный способ преобразовать эту строку в объект JavaScript.

Очевидно, что я могу сделать это небезопасным способом, используя что-то вроде:

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

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

4 ответ(ов)

0

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

В этом примере строка jsonRes содержит JSON-данные, и с помощью метода JSON.parse мы преобразуем её в объект JavaScript, который можно использовать в коде.

0

Похоже, у вас возникает следующая проблема:

Вы принимаете данные через Ajax, WebSocket и т.д., и они находятся в строковом формате. Вам нужно проверить, можно ли их распарсить с помощью JSON.parse. Проблема в том, что если вы всегда будете запускать JSON.parse, ваша программа может продолжать выполняться "успешно", но в консоли вы все равно увидите ошибку с сообщением "Error: unexpected token 'x'".

Вот пример кода, который может помочь вам справиться с этой ситуацией:

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {
  // Здесь обработка ошибки, если нужно
}

data || (data = {
  message: 'Серверная ошибка, пожалуйста, попробуйте еще раз'
});

Если вы хотите избежать появления ошибок в консоли, вы можете предварительно проверить, является ли строка корректным JSON. Для этого попробуйте воспользоваться регулярным выражением или библиотеками для валидации JSON. Это поможет избежать ситуаций, когда JSON.parse выбрасывает ошибку из-за некорректного формата данных.

0

В данном примере используется jQuery для выполнения AJAX-запроса. Конфигурация запроса задается в объекте, передаваемом в метод $.ajax().

Вот перевод вашего текста на русский в стиле ответа на StackOverflow:

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

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

0

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

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

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

Однако обратите внимание, что использование функции eval может представлять собой угрозу безопасности, если данные не являются надежными. Старайтесь избегать eval, когда это возможно, и рассматривайте использование безопасных методов парсинга, таких как JSON.parse, если формат данных представляет собой корректную строку JSON. В вашем случае, данные должны выглядеть следующим образом: Data='{"result":true,"count":1}', чтобы их можно было распарсить с помощью JSON.parse.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь