it-roy-ru.com

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

Откройте консоль для просмотра ошибки

142
coiso

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

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

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

185
SLaks

Допустим, вы знаете, что это действительно 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);
82
EdH

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

JSON.stringify(products);

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

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

54
Onur Yıldırım

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

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

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

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

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

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

26
Derin
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"}]';
10
pktangyue

JSON.parse ожидает строку в параметре. Чтобы решить эту проблему, вам нужно привести в порядок свой 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
Térence
[
  {
    "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, который вы можете разобрать.

3
San

Вот функция, которую я сделал на основании предыдущих ответов: она работает на моей машине, но 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;
            }
2
tmurphree

Когда вы используете POST или метод PUT, убедитесь, что вы структурировали часть тела.

Я задокументировал пример здесь https://Gist.github.com/manju16832003/4a92a2be693a8fda7ca84b58b8fa7154

2
Manjunath Reddy

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

  1. Новые строки персонажей.

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

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

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

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

{
    "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 с большим количеством текста.

1
c00000fd

Вы должны ввести строку 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
1
hoogw

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

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

если вы хотите напечатать весь json, используйте JSON.stringify ()

1
Kiran Maniya

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

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

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

1
Chris

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

var i, j;

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

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

0
Elvis Silva Noleto

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

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

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

0
abhijit padhy

Теперь, очевидно, \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;
        }
    }
}
0
Pacerier

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

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

0
Ari Waisberg

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

0
Shashank Bodkhe

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

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

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

0
att

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

 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

0
Well Smith