Безопасное преобразование строки JSON в объект
У меня есть строка с данными в формате JSON, и я ищу безопасный способ преобразовать эту строку в объект JavaScript.
Очевидно, что я могу сделать это небезопасным способом, используя что-то вроде:
var obj = eval("(" + json + ')');
Однако этот подход делает меня уязвимым, так как JSON-строка может содержать другой код, что достаточно опасно просто так использовать eval.
4 ответ(ов)
Использование 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, который можно использовать в коде.
Похоже, у вас возникает следующая проблема:
Вы принимаете данные через 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
выбрасывает ошибку из-за некорректного формата данных.
В данном примере используется jQuery для выполнения AJAX-запроса. Конфигурация запроса задается в объекте, передаваемом в метод $.ajax()
.
Вот перевод вашего текста на русский в стиле ответа на StackOverflow:
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
В данном случае callback
будет вызван по успешному завершению запроса и получит возвращаемые данные в качестве аргумента. Эти данные будут представлять собой объект или массив JavaScript, которые определяются по структуре JSON и парсятся с использованием метода $.parseJSON()
.
Попробуйте использовать метод с этим объектом данных. Например: 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
.
Преобразование объекта JS в строку JSON
Как сравнить массивы в JavaScript?
Почему Python не может разобрать эти данные JSON? [закрыто]
Как вывести циклическую структуру в формате, похожем на JSON?
Как прочитать JSON-файл в память сервера?