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

192

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

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

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

coiso
источник
16
У вас нет JSON? Это литерал массива / объекта.
Берги

Ответы:

220

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

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

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

SLaks
источник
1
это не массив? Почему это объект? Объекты начинаются с {, а массивы начинаются с [? или я здесь не
4
Массивы являются объектами; это то, что .toString()возвращается (согласно спецификации).
Слэки
1
Является ли решение, чтобы сначала привести в порядок объект?
Мохаммед Нурельдин
6
@MohammedNoureldin: нет; решение - ничего не делать и использовать свой объект.
Слух
2
Что если я получу свои данные из удаленного сервиса, использующего Ajax, который вернет мне ответ Json? И я хочу, чтобы этот ответ был сохранен в объект массива JavaScript?
Мохаммед Нурельдин
125

Допустим, вы знаете, что это действительно 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, и это сработало.
Альбертски
1
пришли сюда дважды Thnx
Бенджамин Хоффман
После расшифровки Base64 появился специальный символ, ваш метод мне очень помог! Thx
Гийом
не доверяйте источнику, отвечающему с неверным JSON. Просто сообщите им, что данные повреждены. они должны это исправить. если вы попытаетесь «восстановить» ответ подобным образом или подобным образом, вы будете поддерживать нестабильную связь.
Онур Йылдырым
Должно быть s = s.replace(/[\u0000-\u001F]+/g,""); вместо s = s.replace(/[\u0000-\u0019]+/g,""); , для замены всех управляющих символов. Правильно?
Хунчао Чжан
64

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

JSON.stringify(products);

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

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

Онур Йылдырым
источник
28

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

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

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

Я тоже пытался JSON.stringify(inputString), но это не помогло.

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

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

Derin
источник
2
Символ новой строки также был моей проблемой. Итак, как мы можем восстановить такие данные?
Коленда
@kolenda У вас неверный JSON. Вам нужно изменить сервер, чтобы использовать фактический сериализатор JSON, который возвращает действительный JSON.
SLaks
У меня была похожая проблема, но вместо «\ n» у меня была «\ e» внутри пути (я изменил код на стороне сервера, чтобы использовать «/» вместо «\», и ​​все снова работало)
Адам Тал,
использовать побег, где \ n будет \\ n
Пол Грегуар
14

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
Теранс
источник
12
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"}]';
pktangyue
источник
2
@SLaks Да, OP может использовать продукты напрямую. но если он хочет использовать JSON.parse, аргументы должны быть строкой.
pktangyue
что я должен делать в ASP Classic, потому что это комментарий
Ашиш Бхатт
1
@ashishbhatt вы можете использовать ", а затем изменить все другие" на \ "
pktangyue
2
Как-то такJSON.parse(products.replace(/'/g, '"'))
Химический Программист
11

Вы должны проверить вашу строку JSON здесь .

Допустимая строка 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
hoogw
источник
В моем случае Grails 2.5.6 визуализируется render ([key: value])с одинарными кавычками, что приводит к JSON parseError в позиции 1 в jquery Ajax. render (groovy.json.JsonOutput.toJson ([key:value]))помог мне
Филбурнс
3
[
  {
    "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

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

Еще одна ошибка, которая может привести к "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 с большим количеством текста.

C00000FD
источник
1

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

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

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

Крис
источник
0

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]);
ic3b3rg
источник
0

Теперь , по- видимому \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));где x34, 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;
        }
    }
}
Pacerier
источник
0

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

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

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

абхиджит пади
источник
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

Хорошо смит
источник
0

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

Шашанк Бодхе
источник
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[0].name); //name of item at 0th index

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

Киран Мания
источник
0

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

Элвис Сильва Нолето
источник
0

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

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

Ари Вайсберг
источник
0

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

Так кидал Unexpected token n in JSON at position 0

Аашутош Рати
источник
-24

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

eval(inputString);
Кастери
источник
Каждый вызов eval () создает новый экземпляр интерпретатора JavaScript. Это может быть ресурсным боровом.
Йеко