#javascript #json #parsing #servlets #xmlhttprequest
#javascript #json #синтаксический анализ #сервлеты #xmlhttprequest
Вопрос:
У меня есть некоторый JSON, который был передан из сервлета и хранится в xmlhttp.responseText. Я хочу разложить этот JSON так, чтобы у меня могли быть значения данных, размера, стиля, имени и т.д. Также я хотел бы, чтобы значение виджета было в отдельной переменной.
Вот JSON:
{
"widget vlaue=2": {
"debug": "on",
"window": {
"title": "Sample Konfabulator Widget",
"name": "main_window",
"width": 500,
"height": 500
},
},
"image": {
"src": "Images/Sun.png",
"name": "sun1",
"hOffset": 250,
"vOffset": 250,
"alignment": "center"
},
"text": {
"data": "Click Here",
"size": 36,
"style": "bold",
"name": "text1",
"hOffset": 250,
"vOffset": 100,
"alignment": "center",
"onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
}
}
Я пробовал это:
obj = JSON.parse(xmlhttp.responseText);
но это не удалось. Я не смог найти ничего, связанного с этим, в Интернете. Кто-нибудь, пожалуйста, может мне помочь с этим?
Комментарии:
1. Что вы подразумеваете под этим «сбой»? Вы получали какие-либо ошибки от браузера?
2. это как-то связано с vlaue = 2?
3. вывод «не определен» для этого
4. Смехотворно, когда кто-то говорит «это может показаться действительно глупым, но …», это обычно не относится к человеку, с которым они разговаривают. Обычно это означает «это может показаться очевидным, но почему бы вам все равно не проверить». В этом нет неуважения к человеку, которому это говорится.
5. @typedef1 чувак, он не называл тебя тупым, расслабься. Дело в том, что мы иногда допускаем глупые ошибки или опечатки, Strelok просто напоминал вам, что это одна вещь, которую вы можете проверить. Это просто мягкое напоминание / подсказка, я бы не обиделся.
Ответ №1:
Из json.org :
Чтобы преобразовать текст JSON в объект, вы можете использовать функцию eval(). eval() вызывает компилятор JavaScript. Поскольку JSON является надлежащим подмножеством JavaScript, компилятор правильно проанализирует текст и создаст структуру объекта. Текст должен быть заключен в скобки, чтобы избежать двусмысленности синтаксиса JavaScript.
var MyObject = eval(‘(‘ myJSONtext ‘)’);
Однако JSON.parse по-прежнему рекомендуется:
Функция eval выполняется очень быстро. Однако он может компилировать и выполнять любую программу на JavaScript, поэтому могут возникнуть проблемы с безопасностью. Использование eval показано, когда источник является надежным и компетентным. Гораздо безопаснее использовать анализатор JSON. В веб-приложениях через XMLHttpRequest связь разрешена только с тем же источником, который предоставляет эту страницу, поэтому ей доверяют. Но это может быть некорректно. Если сервер не является строгим в своей кодировке JSON или если он не проводит тщательную проверку всех своих входных данных, то он может выдавать недопустимый текст в формате JSON, который может содержать опасный скрипт. Функция eval выполнила бы скрипт, высвобождая его злобу.
Чтобы защититься от этого, следует использовать анализатор JSON. Анализатор JSON распознает только текст в формате JSON, отклоняя все сценарии. В браузерах, которые предоставляют встроенную поддержку JSON, анализаторы JSON также намного быстрее, чем eval. Ожидается, что встроенная поддержка JSON будет включена в следующий стандарт ECMAScript.
var MyObject = JSON.parse(myJSONtext, средство восстановления);
Возможно, с вашим JSON что-то не так, посетитеjsonlint.com для бесплатного веб-валидатора JSON.
Комментарии:
1. Мой JSON был проверен с помощью JSONLint. Я делал это до того, как перешел на Javascript.
2. Вы сказали, что это было из сервлета, вы на 100% уверены, что строка не была автоматически экранирована или изменена? Однажды я использовал PHP для передачи строки JSON, и, как вы, возможно, знаете, двойные кавычки все портят, потому что они не были должным образом экранированы в PHP. Поскольку в каждом языке используются разные escape-символы, ожидаемый результат от сервлета, возможно, был изменен. Попробуйте распечатать строку JSON на стороне сервера, чтобы убедиться, что она в точности соответствует тому, что вы опубликовали выше.
3. Ну, приведенный выше пример похож на этот. Я не могу опубликовать точный JSON из-за конфиденциальности. хотя мой JSON был проверен с помощью JSONLint.
4. В вашем первом сообщении JSON копируется и вставляется из выходных данных сервлета или из какого-либо исходного кода, который вы написали? Я действительно подозреваю, что JSON был бессознательно изменен во время выполнения.
Ответ №2:
Ваш JSON, который вы предоставили, НЕДЕЙСТВИТЕЛЕН. Строка 9 содержит лишнее ,
, которого там не должно быть.
Вот JSFiddle, который работает без ,
.
Комментарии:
1. Наметанный глаз, действительно, я считаю, что это ошибка. Теперь я узнал, что мне не следует на 100% полагаться на JSON validator, поскольку не все валидаторы проверяют наличие запятой в конце. (Я думаю, это потому, что не все библиотеки JSON также запрещают это)
2. Я не знаю, какой JSON операционная система вставляла в JSLint, но JSON в вопросе также не проверяется в JSLint.
3. На самом деле, я тоже скопировал и вставил его JSON в JSONLint, и в первый раз, когда я это сделал, это сработало. Я только что попробовал еще раз 5 секунд назад, и это ЗАВЕРШИЛОСЬ НЕУДАЧЕЙ (конечно, из-за запятой в строке 9). Я думаю, что OP или кто-то отредактировал JSON, который он опубликовал после моей первой попытки проверки его в JSONLint.