Uncaught SyntaxError: Неожиданный токен с JSON.parse

что вызывает эту ошибку в третьей строке?

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

Ответ 1

products - это объект. (создание из литерала объекта)

JSON.parse() используется для преобразования строки , содержащей нотацию JSON, в объект Javascript.

Ваш код превращает объект в строку (путем вызова .toString()), чтобы попытаться разобрать его как текст JSON.
По умолчанию .toString() возвращает "[object Object]", что недействительно JSON; следовательно, ошибка.

Ответ 2

Скажем, вы знаете, что это действительно JSON, но вы все еще получаете это...

В этом случае вероятно, что в строке есть скрытые/специальные символы из любого источника, который вы получаете. Когда вы вставляете в валидатор, они теряются, но в строке они все еще существуют. Эти символы, пока они невидимы, сломаются JSON.parse()

Если s является вашим сырым JSON, то очистите его с помощью

// preserve newlines, etc - use valid JSON
s = s.replace(/\\n/g, "\\n")  
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
// remove non-printable and other non-valid JSON chars
s = s.replace(/[\u0000-\u0019]+/g,""); 
var o = JSON.parse(s);

Ответ 3

Кажется, вы хотите, чтобы привести в порядок объект. Так что сделайте это:

JSON.stringify(products);

Причина ошибки заключается в том, что JSON.parse() ожидает значение String а products - Array.

Примечание: я думаю, что он пытается json.parse('[object Array]') который жалуется, что не ожидал токен o после [.

Ответ 4

Я нашел ту же проблему с JSON.parse(inputString).

В моем случае входная строка поступает с моей страницы сервера [возврат метода страницы].

Я напечатал typeof(inputString) - это была строка, все еще ошибка.

Я также пробовал JSON.stringify(inputString), но это не помогло.

Позже я обнаружил, что это проблема с новым оператором строки [\n], внутри значения поля.

Я сделал замену [с другим символом, положил новую строку после синтаксического анализа], и все работает нормально.

Ответ 5

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];

измените на

products = '[{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}]';

Ответ 6

JSON.parse ожидает параметр String. Чтобы решить проблему, вам необходимо укрепить объект JSON.

products = [{"name":"Pizza","price":"10","quantity":"7"}, {"name":"Cerveja","price":"12","quantity":"5"}, {"name":"Hamburguer","price":"10","quantity":"2"}, {"name":"Fraldas","price":"6","quantity":"2"}];
console.log(products);
var b = JSON.parse(JSON.stringify(products));  //solves the problem

Ответ 7

[
  {
    "name": "Pizza",
    "price": "10",
    "quantity": "7"
  },
  {
    "name": "Cerveja",
    "price": "12",
    "quantity": "5"
  },
  {
    "name": "Hamburguer",
    "price": "10",
    "quantity": "2"
  },
  {
    "name": "Fraldas",
    "price": "6",
    "quantity": "2"
  }
]

Вот ваш идеальный Json, который вы можете проанализировать.

Ответ 9

Здесь функция, созданная на основе предыдущих ответов: она работает на моей машине, но YMMV.

          /**
             * @description Converts a string response to an array of objects.
             * @param {string} string - The string you want to convert.
             * @returns {array} - an array of objects.
            */
            function stringToJson(input) {
              var result = [];

              //replace leading and trailing [], if present
              input = input.replace(/^\[/,'');
              input = input.replace(/\]$/,'');

              //change the delimiter to 
              input = input.replace(/},{/g,'};;;{');

              // preserve newlines, etc - use valid JSON
              //https://stackoverflow.com/questions/14432165/uncaught-syntaxerror-unexpected-token-with-json-parse
            input = input.replace(/\\n/g, "\\n")  
            .replace(/\\'/g, "\\'")
            .replace(/\\"/g, '\\"')
            .replace(/\\&/g, "\\&")
            .replace(/\\r/g, "\\r")
            .replace(/\\t/g, "\\t")
            .replace(/\\b/g, "\\b")
            .replace(/\\f/g, "\\f");
            // remove non-printable and other non-valid JSON chars
            input = input.replace(/[\u0000-\u0019]+/g,""); 

              input = input.split(';;;');

              input.forEach(function(element) {
                // console.log(JSON.stringify(element));

                result.push(JSON.parse(element));
              }, this);

              return result;
            }

Ответ 10

Еще одна полученная информация, которая может привести к исключению "SyntaxError: Unexpected token" при вызове JSON.parse(), использует любое из следующих значений в строковых значениях:

  • Новые символы.

  • Вкладки (да, вкладки, которые вы можете создать с помощью клавиши Tab!)

  • Любая отдельная косая черта \ (но по какой-то причине не /, по крайней мере, не в Chrome.)

(Полный список см. в разделе Строка здесь.)

Например, следующее исключение:

{
    "msg" : {
        "message": "It cannot
contain a new-line",
        "description": "Some discription with a     tabbed space is also bad",
        "value": "It cannot have 3\4 un-escaped"
    }
}

Поэтому его следует изменить на:

{
    "msg" : {
        "message": "It cannot\ncontain a new-line",
        "description": "Some discription with a\t\ttabbed space",
        "value": "It cannot have 3\\4 un-escaped"
    }
}

Что, я бы сказал, делает его совершенно нечитаемым в формате JSON с большим количеством текста.

Ответ 11

Надеюсь, это поможет кому-то другому.

Моя проблема заключалась в том, что я прокомментировал HTML в функции обратного вызова PHP через AJAX, который обрабатывал комментарии и возвращал недействительный JSON.

Как только я удалил прокомментированный HTML, все было хорошо, и JSON не разбирался без проблем.

Ответ 12

Вы должны подтвердить правильность строки json по адресу https://jsonformatter.curiousconcept.com/

допустимая строка json должна иметь двойную кавычку.

JSON.parse({"u1":1000,"u2":1100})       // will be ok

ошибка не указана

JSON.parse({u1:1000,u2:1100})    
// error Uncaught SyntaxError: Unexpected token u in JSON at position 2

ошибка в одинарных кавычках

JSON.parse({'u1':1000,'u2':1100})    
// error Uncaught SyntaxError: Unexpected token ' in JSON at position 1

Ответ 13

Единственная ошибка, которую вы делаете, это то, что вы анализируете уже проанализированный объект, поэтому он выдает ошибку, используйте это, и вам будет хорошо идти.

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products[0].name); //name of item at 0th index

Ответ 14

- это массив, который можно использовать напрямую:

var i, j;

for(i=0;i<products.length;i++)
  for(j in products[i])
    console.log("property name: " + j,"value: "+products[i][j]);

Ответ 15

Теперь, очевидно, \r, \b, \t, \f и т.д. - это не единственные проблемные символы, которые могут дать вам эту ошибку.

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

Запустите этот тестовый код в своем браузере:

var arr = [];
for(var x=0; x < 0xffff; ++x){
    try{
        JSON.parse(String.fromCharCode(0x22, x, 0x22));
    }catch(e){
        arr.push(x);
    }
}
console.log(arr);

Тестирование в Chrome, я вижу, что он не позволяет JSON.parse(String.fromCharCode(0x22, x, 0x22));, где x равно 34, 92 или от 0 до 31.

Шары 34 и 92 являются символами " и \ соответственно, и они обычно ожидаются и надлежащим образом экранируются. Это цифры от 0 до 31, что даст вам проблемы.

Чтобы помочь с отладкой, прежде чем выполнять JSON.parse(input), сначала убедитесь, что вход не содержит проблемных символов:

function VerifyInput(input){
    for(var x=0; x<input.length; ++x){
        let c = input.charCodeAt(x);
        if(c >= 0 && c <= 31){
            throw 'problematic character found at position ' + x;
        }
    }
}

Ответ 16

Зачем вам нужен JSON.parse? Он уже находится в массиве формата объекта.

Лучше использовать JSON.stringify, как показано ниже: var b = JSON.stringify(products);

Это может вам помочь.

Ответ 17

О, мужик, решения во всех приведенных выше ответах пока не спомогли мне. У меня была похожая проблема только сейчас. Мне удалось решить это с упаковкой с цитатой. Смотрите скриншот. Ого.

enter image description here

Оригинал:

var products = [{
  "name": "Pizza",
  "price": "10",
  "quantity": "7"
}, {
  "name": "Cerveja",
  "price": "12",
  "quantity": "5"
}, {
  "name": "Hamburguer",
  "price": "10",
  "quantity": "2"
}, {
  "name": "Fraldas",
  "price": "6",
  "quantity": "2"
}];
console.log(products);
var b = JSON.parse(products); //unexpected token o

Ответ 18

Ошибка, которую вы получаете, т.е. "Неожиданный токен o", заключается в том, что ожидается json, но объект получен при разборе. Это "о" является первой буквой слова "объект".

Ответ 19

Если есть пробелы в начале или в конце, он будет недействительным. Конечные/ведущие пробелы могут быть удалены как

mystring = mystring.replace(/^\s+|\s+$/g, "");

Источник: http://www.toptip.ca/2010/02/javascript-trim-leading-or-trailing.html

Ответ 20

Это может произойти по многим причинам, но, вероятно, из-за недопустимого символа, поэтому вы можете использовать JSON.stringify(obj); это превратит ваш объект в JSON, но помните, что это выражение JQUERY.

Ответ 21

У меня есть эта ошибка, ПОТОМУ ЧТО API, который возвратил объект json, дал ОШИБКУ (в моем случае Code Igniter, возвращает html, когда код php терпит неудачу), так что ЭТО НЕ ОБЪЕКТ JSON.

Проверьте предложения SQL и код PHP и протестируйте его с помощью Postman (или другого API-тестера)

Ответ 22

Используйте eval. Он принимает выражение JavaScript/код как строку и оценивает/выполняет его.

eval(inputString);