Подтвердить что ты не робот

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: Неожиданный токен '

Я в тупике. Любая помощь ценится! Спасибо!

4b9b3361

Ответ 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 и ссылаться на нее вместо того, чтобы строчить и разбор.