У меня есть строка в приложении сервера Java, доступ к которому осуществляется с помощью AJAX. Это выглядит примерно так:
var json = [{
"adjacencies": [
{
"nodeTo": "graphnode2",
"nodeFrom": "graphnode1",
"data": {
"$color": "#557EAA"
}
}
],
"data": {
"$color": "#EBB056",
"$type": "triangle",
"$dim": 9
},
"id": "graphnode1",
"name": "graphnode1"
},{
"adjacencies": [],
"data": {
"$color": "#EBB056",
"$type": "triangle",
"$dim": 9
},
"id": "graphnode2",
"name": "graphnode2"
}];
Когда строка извлекается с сервера, есть ли простой способ превратить ее в живой объект JavaScript (или массив)? Или мне нужно вручную разбить строку и построить свой объект вручную?
Ответы:
Поддержка современных браузеров
JSON.parse()
.В браузерах , которые не делают, вы можете включить в
json2
библиотеку .источник
Весь смысл JSON в том, что строки JSON могут быть преобразованы в собственные объекты без каких-либо действий. Проверьте эту ссылку
Вы можете использовать либо
eval(string)
илиJSON.parse(string)
.Однако
eval
это рискованно. С json.org:источник
Делай как jQuery делает! (сущность)
Таким образом, вам не нужна никакая внешняя библиотека, и она все еще работает в старых браузерах.
источник
eval()
.Чтобы собрать все элементы массива и вернуть объект json
Чтобы проанализировать те же данные, мы проходим, как это
источник
Вы также можете использовать,
eval()
ноJSON.parse()
это более безопасный и простой способ, так почему бы вам?хорошо и работает
Я не вижу причин, почему вы предпочитаете использовать
eval
. Это только подвергает вашу заявку риску.Тем не менее - это является также возможно.
плохо - но тоже работает
Почему
eval
плохая идея?Рассмотрим следующий пример.
Некоторые сторонние или пользовательские данные предоставили строковые данные JSON.
Ваш серверный скрипт обрабатывает эти данные.
Использование
JSON.parse
:скину
Функция не будет выполнена.
Ты в безопасности.
Использование
eval()
:выполнит функцию и вернет текст.
Если я заменю эту безвредную функцию на функцию, которая удаляет файлы из папки вашего сайта, вы были взломаны. В этом примере не будут выдаваться ошибки / предупреждения.
Вы НЕ в безопасности.
Мне удалось манипулировать текстовой строкой JSON, чтобы она действовала как функция, которая будет выполняться на сервере.
eval(JSON)[0].adjacencies[0].nodeTo
ожидает обработки строки JSON, но в действительности мы только что выполнили функцию на нашем сервере.Этого также можно избежать, если мы проверяем все данные, предоставленные пользователем, перед передачей их
eval()
функции на стороне сервера, но почему бы просто не использовать встроенный инструмент для анализа JSON и избежать всех этих проблем и опасностей?источник
И если вы также хотите, чтобы десериализованный объект имел функции, вы можете использовать мой небольшой инструмент: https://github.com/khayll/jsmix
источник
Если вы вставляете строку на стороне сервера в HTML, не нужно ничего делать:
Для простой Java в JSP:
Для распорок ширины JSP:
источник
Я думаю, что это должно помочь:
Также документация также доказывает, что вы можете использовать require () для файлов json: https://www.bennadel.com/blog/2908-you-can-use-require-to-load-json-javascript-object-notation-files -в-узла js.htm
источник