Синтаксический анализ строки JSON в Javascript

#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, который работает без , .

http://jsfiddle.net/ApDsP/

Комментарии:

1. Наметанный глаз, действительно, я считаю, что это ошибка. Теперь я узнал, что мне не следует на 100% полагаться на JSON validator, поскольку не все валидаторы проверяют наличие запятой в конце. (Я думаю, это потому, что не все библиотеки JSON также запрещают это)

2. Я не знаю, какой JSON операционная система вставляла в JSLint, но JSON в вопросе также не проверяется в JSLint.

3. На самом деле, я тоже скопировал и вставил его JSON в JSONLint, и в первый раз, когда я это сделал, это сработало. Я только что попробовал еще раз 5 секунд назад, и это ЗАВЕРШИЛОСЬ НЕУДАЧЕЙ (конечно, из-за запятой в строке 9). Я думаю, что OP или кто-то отредактировал JSON, который он опубликовал после моей первой попытки проверки его в JSONLint.