JSON.Parse, 'Uncaught SyntaxError: Неожиданный токен o
У меня возникают проблемы с возвратом JSON из веб-службы. Похоже, что JSON не хватает кавычек, но когда я добавляю кавычки в JSON, я получаю сообщение об ошибке. Вот сообщение об ошибке: "Uncaught SyntaxError: Неожиданный токен o. Когда я записываю строку в консоль: [object Object], [object Object]
Вот пример кода, который имитирует ошибку:
//Error I am trying to solve
var jsonString = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]';
var myData = JSON.parse(jsonString);
$(document).ready(function() {
var $grouplist = $('#groups');
$.each(myData, function() {
$('<li>' + this.Name + '</li>').appendTo($grouplist);
});
});
Вот тот же код с одинарными кавычками вокруг строки. Он работает
//Successful Javascript
var jsonString = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]';
var myData = JSON.parse(jsonString);
$(document).ready(function() {
var $grouplist = $('#groups');
$.each(myData, function() {
$('<li>' + this.Name + '</li>').appendTo($grouplist);
});
});
//Successful HTML
<ul id="groups"></ul>
Но когда я пытаюсь добавить кавычки к строке, как мне кажется, мне нужно в моем реальном коде, она терпит неудачу:
//Does not work when I need to append quotes to the string:
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
jsonStringQuotes = "'" + jsonStringNoQuotes + "'";
var myData = JSON.parse(jsonStringQuotes);
$(document).ready(function() {
var $grouplist = $('#groups');
$.each(myData, function() {
$('<li>' + this.Name + ',' + this.Id + '</li>').appendTo($grouplist);
});
});
Вот ошибка:
строка журнала для консоли: [объект объекта], [объект объекта]
data.js: 809 Uncaught SyntaxError: Неожиданный токен '
Я в тупике. Любая помощь ценится! Спасибо!
Ответы
Ответ 1
Без одинарных кавычек вокруг него вы создаете массив с двумя объектами внутри него. Это собственный синтаксис JavaScript. Когда вы добавляете кавычки, этот объект (массив + 2 объекта) теперь является строкой. Вы можете использовать JSON.parse
для преобразования строки в объект JavaScript. Вы не можете использовать JSON.parse
для преобразования объекта JavaScript в объект JavaScript.
//String - you can use JSON.parse on it
var jsonStringNoQuotes = '[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]';
//Already a javascript object - you cannot use JSON.parse on it
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
Кроме того, ваш последний пример терпит неудачу, потому что вы добавляете буквальные символы одиночной кавычки в строку JSON. Это незаконно. Спецификация JSON гласит, что разрешены только двойные кавычки. Если вы были в console.log
следующих...
console.log("'"+[{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}]+"'");
//Logs:
'[object Object],[object Object]'
Вы увидите, что он возвращает строковое представление массива, которое преобразуется в список, разделенный запятыми, и каждый элемент списка будет строковым представлением объекта, который равен [object Object]
. Помните, что ассоциативные массивы в javascript - это просто объекты, каждая пара ключей/значений является свойством/значением.
Почему это происходит? Поскольку вы начинаете со строки "'"
, вы пытаетесь добавить к ней массив, который запрашивает его строковое представление, тогда вы добавляете другую строку "'"
.
Пожалуйста, не путайте JSON с Javascript, так как это совершенно разные вещи. JSON - это формат данных, который по-человечески читается и предназначен для соответствия синтаксису, используемому при создании объектов javascript. JSON - это строка. Объекты Javascript не являются, и поэтому, когда объявленные в коде не окружены кавычками.
Смотрите эту скрипку:
http://jsfiddle.net/NrnK5/
Ответ 2
var jsonStringNoQuotes = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
он создаст объект json. нет необходимости разбирать.
jsonStringQuotes = "'" + jsonStringNoQuotes + "'";
вернет '[object]'
Вот почему он (ниже) вызывает ошибку
var myData = JSON.parse(jsonStringQuotes);
Ответ 3
Ваш последний пример недействителен JSON. Одиночные кавычки не допускаются в JSON, за исключением внутренних строк. Во втором примере одиночные кавычки не находятся в строке, но служат для отображения начала и конца.
См. http://www.json.org/ для спецификаций.
Должно ли добавляться: Почему вы так думаете: "Как мне кажется, в моем реальном коде"? Тогда, возможно, мы сможем помочь вам придумать решение.
Ответ 4
Возможно, что-то из сервера уже оценивается как объект JSON? Например, используя метод jQuery get:
$.get('/service', function(data) {
var obj = data;
/*
"obj" is evaluated at this point if server responded
with "application/json" or similar.
*/
for (var i = 0; i < obj.length; i++) {
console.log(obj[i].Name);
}
});
В качестве альтернативы, если вам нужно превратить объект JSON в строковый литерал JSON, вы можете использовать JSON.stringify
:
var json = [{"Id":"10","Name":"Matt"},{"Id":"1","Name":"Rock"}];
var jsonString = JSON.stringify(json);
Но в этом случае я не понимаю, почему вы не можете просто взять переменную json
и ссылаться на нее вместо того, чтобы строчить и разбор.