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

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

26 ответов

Решение

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

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

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

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

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

JSON.stringify(products);

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

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

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

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

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

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

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

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

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

Вы должны подтвердить правильность строки 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
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"}]';

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

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

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

[
  {
    "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, который вы можете разобрать.

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

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

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()

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

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

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

  3. Любая отдельная косая черта \ (но по какой-то причине нет /По крайней мере, не на 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 с большим количеством текста.

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

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

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

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

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

Теперь видимо \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;
        }
    }
}

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

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

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

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

Теперь это массив объектов JavaScript, а не формат JSON. Чтобы преобразовать его в формат JSON, вам нужно использовать функцию JSON.stringify()

      JSON.stringify(products)

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]);

В моем случае в моем JSON нить

  1. \ т
  2. \ г \ п
  3. \ п
  4. :
  5. "

Я заменил их другими символами или символами, а затем снова вернулся к кодированию.

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

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

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

Ошибка, которую я делал, проходила null (неосознанно) в JSON.parse().

Так что бросил Unexpected token n in JSON at position 0

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

Оригинал:

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

Проверьте этот код. Это дает вам четкое решение ошибки синтаксического анализа JSON. Обычно это происходит из-за символов новой строки и пробела между началом ключа json и концом ключа json.

data_val = data_val.replace(/[\n\s]{1,}\"/g, "\"")  
               .replace(/\"[\n\s]{1,}/g, "\"")  
               .replace(/[\n]/g, "\\n") 

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

eval(inputString);
Другие вопросы по тегам