SyntaxError: Несподіваний маркер o в JSON в позиції 1


139

Я аналізую декілька даних, використовуючи клас типу в своєму контролері, я отримую дані наступним чином:

{  
   "data":{  
      "userList":[  
         {  
            "id":1,
            "name":"soni"
         }
      ]
   },
   "status":200,
   "config":{  
      "method":"POST",
      "transformRequest":[  
         null
      ],
      "transformResponse":[  
         null
      ],
      "url":"/home/main/module/userlist",
      "headers":{  
         "rt":"ajax",
         "Tenant":"Id:null",
         "Access-Handler":"Authorization:null",
         "Accept":"application/json, text/plain, */*"
      }
   },
   "statusText":"OK"
}

Я намагався зберігати такі дані

var userData = _data;
var newData = JSON.parse(userData).data.userList;

Як я можу витягнути список користувачів до нової змінної?


11
Можливо, не потрібно використовувати JSON.parse. Спробуйте використовувати userDataбезпосередньо як об’єкт.
Mohit Bhardwaj

13
Якщо console.log(typeof userData)показує, objectто у вас вже є об’єкт javascript, а не рядок JSON, який потрібно розібрати.
t.niese

1
@MohitBhardwaj так, не потрібно вимагати розбору ..
Soniya Mohan

5
Зазвичай щоразу, коли ви отримуєте цю помилку, - Unexpected token o in JSONшвидше за все, ви намагаєтеся розібрати об'єкт, який вже знаходиться в розбірній формі.
Mohit Bhardwaj

@MohitBhardwaj гаразд!
Сонія Мохан

Відповіді:


191

Опублікований вами JSON виглядає чудово, проте у вашому коді це, швидше за все, вже не рядок JSON, а вже об’єкт JavaScript. Це означає, що більше аналізувати не потрібно.

Ви можете перевірити це самостійно, наприклад, на консолі Chrome:

new Object().toString()
// "[object Object]"

JSON.parse(new Object())
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse("[object Object]")
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse()перетворює вхід у рядок. toString()Метод JavaScript об'єктів за замовчуванням повертає [object Object], в результаті спостережуваного поведінки.

Спробуйте замість цього:

var newData = userData.data.userList;

1
Так це стосується всіх видів браузерів?
приїжджайте

@Timo Чи можете ви подивитись це посилання.
V SH

Іноді ця помилка може виникнути, коли кінцева точка api url, яка обслуговує запит, має помилку в своєму коді або іншому включеному або використаному файлі, і вона видає помилку, яка не обробляється або не відзначається. Здебільшого ви можете це отримати, якщо подивитись на вкладку мережі в інструментах для розробників браузера або ви можете натиснути на кінцеву точку, використовуючи пост людини, і побачити, що з’являється.
MuturiAlex

65

першими параметрами функції JSON.parseмає бути String, а ваші дані - це об’єкт JavaScript, тому він перетвориться на String [object object], який слід використовувати JSON.stringifyперед передачею даних

JSON.parse(JSON.stringify(userData))

1
Великий допоміг брато. Дякую :)
Anand_5050

Це допомогло. Дякую за рішення.
Наг Арджун

Ти врятував мій день брато. Дякую :)
Dwarkesh Soni

це не буде працювати, коли рядок містить подвійну цитату, чи є у вас рішення
Містер S Coder

23

Ніколи не використовуйте, JSON.parseне загортаючи його в try-catchблок:

// payload 
let userData = null;

try {
    // Parse a JSON
    userData = JSON.parse(payload); 
} catch (e) {
    // You can read e for more info
    // Let's assume the error is that we already have parsed the payload
    // So just return that
    userData = payload;
}

// Now userData is the parsed result

7
Це насправді не дає відповіді на це запитання, але коментує відсутність обробки винятків.
Річард Дуерр

2
@RichardDuerr, але це допоможе виправити помилку теми голови. тобто SyntaxError: Несподіваний жетон o в JSON в позиції 1
Ніко Джоджо

6
Це просто приховує помилку, але насправді її не вирішує.
Річард

21

Зверху JSON.parse, використовуйте:

var newData = JSON.stringify(userData)

4
JSON.stringify()перетворює об’єкт JavaScript у його рядкове представлення, що є протилежним тому, що JSON.parse()робить. Ви отримували це SyntaxErrorтому, що намагалися розібрати щось, що вже було об’єктом. У рішенні @ Sukhchain він перетворюється на рядок, щоб уникнути цього.
Хуберт

1
Мінус цього полягає в тому, що врешті-решт ви JSON.parse()занадто багато використовуєте. Незважаючи на те, що це досить швидкий процес, розбір JSON виконується синхронно і може потенційно блокувати ваш інтерфейс, тому я б радив не використовувати його. Натомість ви можете перевірити, чи є ваша змінна об'єктом, наприклад, використовуючи, typeof(userData) === 'object'перш ніж намагатися її розібрати.
Хуберт

2

Ну, я мав в виду , що мені потрібно , щоб розібрати об'єкт , як це: var jsonObj = {"first name" : "fname"}. Але я насправді не так. Тому що це вже JSON.


2

Ми також можемо додати чеки так:

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}

1

Несподівана помилка "O" видається, коли дані JSON або String трапляються для розбору.

Якщо це рядок, він уже є строфікованим. Розбір закінчується несподіваною помилкою "O".

Я зіткнувся з подібною (хоча в іншому контексті), я вирішив наступну помилку, видаливши JSON Producer.

    @POST
    @Produces({ **MediaType.APPLICATION_JSON**})
    public Response login(@QueryParam("agentID") String agentID , Officer aOffcr ) {
      return Response.status(200).entity("OK").build();

  }

Відповідь містить повернення рядка "ОК" . Анотація, позначена як @Produces ({** MediaType.APPLICATION_JSON }) **, намагається проаналізувати рядок у форматі JSON, що призведе до несподіваного 'O' .

Видалення @Produces ({ MediaType.APPLICATION_JSON }) працює чудово. Вихід: ОК

Остерігайтеся: також на стороні клієнта, якщо ви робите запит ajax і використовуєте JSON.parse ("ОК"), він видає несподіваний маркер "O"

O - перша літера рядка

JSON.parse (об'єкт) порівнює з jQuery.parseJSON (об'єкт);

JSON.parse ('{"name": "Yergalem", "city": "Dover"}'); --- Працює прекрасно

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.