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

Відкрийте консоль, щоб переглянути помилку


16
У вас немає жодного JSON? Це масив / об'єкт буквально.
Бергі

Відповіді:


220

productsє об’єктом. (створення з об'єкта буквально)

JSON.parse()використовується для перетворення рядка що містить позначення JSON, в об'єкт Javascript.

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


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, і він спрацював.
albertski

1
прийшли сюди вже двічі. thnx
Бенджамін Гофман

Отримав спеціальний символ після декодування Base64, ваш метод мені дуже допоміг! Thx
Гійом

не довіряйте джерелу, що відповідає недійсним JSON. Просто повідомте їм, що дані пошкоджені. вони повинні це виправити. якщо ви спробуєте "відновити" відповідь, як це, або подібними способами, ви будете підтримувати нестабільне спілкування.
Onur Yıldırım

Потрібно s = s.replace(/[\u0000-\u001F]+/g,""); замість s = s.replace(/[\u0000-\u0019]+/g,""); , щоб замінити всі контрольні символи. Правильно?
HongchaoZhang

64

Здається, ви хочете впорядкувати об’єкт. Тож зробіть це:

JSON.stringify(products);

Причиною помилки є те, що JSON.parse()очікує Stringзначення і productsє an Array.

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


28

Я знайшов те саме питання з JSON.parse(inputString) .

У моєму випадку рядок введення надходить зі сторінки мого сервера [повернення методу сторінки] .

Я надрукував typeof(inputString) - це було рядок, все-таки виникає помилка.

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

Пізніше я виявив, що це проблема з новим оператором лінії [\n], усередині поля.

Я зробив заміну [на якийсь інший символ, повернув новий рядок після розбору] і все працює нормально.


2
Новий персонаж рядка також був моєю проблемою. То як ми можемо відновити такі дані?
коленда

@kolenda У вас недійсний JSON. Вам потрібно змінити ваш сервер, щоб використовувати фактичний серіалізатор JSON, який повертає дійсний JSON.
СЛАкс

У мене була схожа проблема, але замість "\ n" у мене було "\ e" всередині шляху (я змінив код сторони сервера на "/" замість "\", і все знову працювало)
Adam Tal

скористайтеся втечею, в якому \ n буде \\ n
Пол Грегуар

14

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

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"}]';

2
@SLaks так, OP може використовувати продукти безпосередньо. але якщо він хоче використовувати JSON.parse, аргументи повинні бути рядком.
pktangyue

що мені робити в ASP Classic, тому що 'є коментар
ashish bhatt

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

У моєму випадку 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;
            }

2

Ще один gotcha, який може призвести до "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

Сподіваємось, це допомагає комусь іншому.

Моя проблема полягала в тому, що я коментував 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]);

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));куди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

Для чого потрібен 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 Sentences і PHP-код і протестуйте його за допомогою Postman (або якогось іншого тестера API)


0

Помилка, яку я робив, проходила null (несвідомо) у JSON.parse ().

Так це кинуло Unexpected token n in JSON at position 0


-24

Використовуйте eval. Він приймає вираз / код JavaScript як рядок і оцінює / виконує його.

eval(inputString);

Кожне виклик eval () створює новий екземпляр інтерпретатора JavaScript. Це може бути ресурсна свиня.
Yëco
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.