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, да, для синтаксического анализа не требуется ..
Сония Мохан,
5
Обычно всякий раз, когда вы получаете эту ошибку Unexpected token o in JSON, скорее всего, вы пытаетесь проанализировать объект, который уже находится в проанализированной форме.
Mohit Bhardwaj
@MohitBhardwaj, ладно!
Сония Мохан

Ответы:

193

Опубликованный вами 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;
Timo
источник
1
Так это применимо для всех типов браузеров?
comeOnGetIt
@Timo Не могли бы вы посмотреть эту ссылку.
V SH
Иногда эта ошибка может возникать, когда конечная точка URL-адреса api, обслуживающая запрос, имеет ошибку в своем коде или другом включенном или используемом файле и выдает ошибку, которая не обрабатывается или не отмечается. В основном вы можете получить это, если посмотрите на вкладку сети в инструментах разработчика браузера или вы можете попасть в конечную точку с помощью почтового менеджера и посмотреть, что произойдет.
MuturiAlex
67

первые параметры функции JSON.parseдолжны быть строкой, а ваши данные - объектом JavaScript, поэтому они будут преобразованы в строку [object object], которую следует использовать JSON.stringifyперед передачей данных

JSON.parse(JSON.stringify(userData))
huruji
источник
1
Отлично помог братан. Спасибо :)
Anand_5050
Помогло.Спасибо за решение.
Наг Арджун,
Ты спас мне день, братан. Спасибо :)
Дваркеш Сони
это не сработает, если строка содержит двойные кавычки, есть ли у вас какое-либо решение
Mr 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
Kousha
источник
7
На самом деле это не отвечает на вопрос, но говорит об отсутствии обработки исключений.
Ричард Дуэрр,
2
@RichardDuerr, но это поможет исправить ошибку заголовка. ie SyntaxError: Неожиданный токен o в JSON в позиции 1
Нико Джоджо
6
Это просто скрывает ошибку, но не решает ее.
Ричард
21

Чуть выше JSON.parseиспользуйте:

var newData = JSON.stringify(userData)
Sukhchain
источник
4
JSON.stringify()преобразует объект JavaScript в его строковое представление, что противоположно тому, что JSON.parse()делает. Вы получили, SyntaxErrorпотому что пытались разобрать что-то, что уже было объектом. В решении @Sukhchain он преобразуется в строку, чтобы этого избежать.
Hubert
1
Обратной стороной этого является то, что в конце концов вы используете JSON.parse()слишком много избыточно. Несмотря на то, что это довольно быстрый процесс, синтаксический анализ JSON выполняется синхронно и потенциально может заблокировать ваш пользовательский интерфейс, поэтому я бы не советовал использовать это. Вместо этого вы можете проверить, является ли ваша переменная объектом, например, используя, typeof(userData) === 'object'прежде чем пытаться ее проанализировать.
Hubert
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 {};
}
Pulkit chadha
источник
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 ("OK"), он выбрасывает неожиданный токен 'O'

O - первая буква строки

JSON.parse (объект) сравнивается с jQuery.parseJSON (объект);

JSON.parse ('{"имя": "Ергалем", "город": "Довер"}'); --- Работает отлично

Yergalem
источник