Разбор JSON с помощью Javascript - PullRequest
0 голосов
/ 20 июля 2011

У меня есть строка JSon, полученная от вызова AJAX:

{status:OK,addresses:[0,1,2,3,4,5]}

Чтобы преобразовать ее в объект JSon, у меня есть эта строка:

var jsonObj = eval(jsonString);

Но исключение выдается!У этого нет сообщения в переменной исключения.Я также попытался использовать

{"status":"OK","addresses":[0,1,2,3,4,5]}

И, опять же, выдается исключение, но сообщается, что обнаружен неожиданный символ '&'.

Я использую Struts2, и JSon полученот действия.

Любая помощь будет оценена.Спасибо

Ответы [ 7 ]

3 голосов
/ 20 июля 2011
{status:OK,addresses:[0,1,2,3,4,5]}

не является допустимым JSON, поскольку отсутствуют кавычки вокруг status и addresses, и не является ни действительным JSON, ни действительным JavaScript , поскольку кавычки вокруг OK отсутствуют.

Кроме того, не используйте eval для анализа JSON - это позволяет злоумышленнику выполнить произвольный JavaScript в контексте вашей страницы. Вместо этого используйте безопасные альтернативы JSON.parse (встроенные в современные браузеры и другие реализации EcmaScript 5) или JSON2 .

1 голос
/ 20 июля 2011

Не использовать eval: используйте правильный анализатор JSON, например JSON2 .

Возможно, у вас есть дополнительный контент в ответе: убедитесь, что вы больше ничего не печатаете.

0 голосов
/ 20 июля 2011

На основании этого комментария:

Итак, я убедился, что когда JSon получен из запроса, все "заменены на" ... может ли это быть проблемой?

Да.Анализатор JSON ожидает получения JSON в качестве входных данных, а не JSON в кодировке HTML.

0 голосов
/ 20 июля 2011

У вас нет строки JSON. У вас есть объектный литерал. Вам нужны имена, чтобы иметь кавычки.

{"status":OK, "addresses":[0,1,2,3,4,5]}
0 голосов
/ 20 июля 2011

Исправлены две проблемы:

  1. Добавьте кавычки вокруг "OK", чтобы сделать его допустимой строкой JavaScript.
  2. Добавить паренсы вокруг строки перед отправкой в ​​eval, как это eval("(" + jsonString + ")")';

Это:

{status:OK,addresses:[0,1,2,3,4,5]}

должно быть изменено на это:

{status:"OK",addresses:[0,1,2,3,4,5]}

должен быть действующим Javascript (обратите внимание на кавычки вокруг "OK").

Должно быть, это действительно JSON (кавычки тоже вокруг ключей):

{"status":"OK", "addresses":[0,1,2,3,4,5]}

ОК, само по себе не является известным фрагментом Javascript без кавычек вокруг него, чтобы превратить его в строку Javascript. В будущем вы можете проверить себя на небольшом тестовом стенде и посмотреть, какая ошибка в вашем любимом отладчике javascript:

http://jsfiddle.net/jfriend00/FcSKR/

var jsonString = '{"status":"OK","addresses":[0,1,2,3,4,5]}';
var jsonObj = eval("(" + jsonString + ")");
alert("success");

Если вы по-прежнему получаете ошибку с {"status":"OK","addresses":[0,1,2,3,4,5]} и добавлением паренов перед отправкой в ​​eval, тогда ваши данные не соответствуют вашим ожиданиям, и вам необходимо выполнить некоторую отладку, чтобы точно определить, что содержится в ответе ( посмотрите на значение в отладчике, поместите значение в предупреждение и т. д.). Возможно, в ответе есть еще кое-что, чего вы не знали.

Примечание: в некоторых ситуациях анализатор JSON, такой как JSON.parse(), и допустимая строка JSON безопаснее, чем eval() с Javascript, который может быть любым.

0 голосов
/ 20 июля 2011

Если вы хотите использовать eval, то вам нужно использовать второй пример, который вы опубликовали ({"status":"OK","addresses":[0,1,2,3,4,5]}), и вам необходимо заключить строку в круглые скобки, как показано:

var jsonObj = eval( '('+jsonString+')' );

Это делает jsonString допустимым оператором javascript.

С учетом сказанного я призываю вас использовать JSON.parse, как и многие другие.Это гораздо более безопасно.

0 голосов
/ 20 июля 2011

Это работает для меня:

JSON.parse('{ "status" : "OK", "addresses" : [0,1,2,3,4,5]}');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...