C++ Json parser crash(302)

Начинающий
Статус
Оффлайн
Регистрация
12 Ноя 2020
Сообщения
20
Реакции[?]
5
Поинты[?]
0
C++:
if (curl) {
        std::string response;
        curl_easy_setopt(curl, CURLOPT_URL, this->apiHttps.c_str());
        curl_easy_setopt(curl, CURLOPT_HEADER, 0);
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10);
        curl_easy_setopt(curl, CURLOPT_POST, 1L);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, fields.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        result = curl_easy_perform(curl);

        if (result == CURLE_OK) {
            // Парсим ответ сервера
            all = json::parse(response);//тут ошибка
            auto link = all["Status"].get<std::string>();//или тут
            auto subendtime = all["SubEndTime"].get<std::string>();//или тут
[json.exception.type_error.302] type must be string, but is null
я нашел в файле json описание
json.exception.type_error.302 | type must be object, but is array | During implicit or explicit value conversion, the JSON type must be compatible to the target type. For instance, a JSON string can only be converted into string types, but not into numbers or boolean types.
, но от этого не легче
причем проблема не у всех, а у нескольких человек
библиотека для json nlohmann
 
Эксперт
Статус
Оффлайн
Регистрация
16 Ноя 2017
Сообщения
1,570
Реакции[?]
1,266
Поинты[?]
4K
zryx
Ну так всё просто друк ?
Вот возьмём простую json-ку
1615268136599.png
Изначале у нас json - это JObject (Обьект JSON)
Внутри него у нас есть поля: lobby_oid и started
Значение у lobby_oid - это поле типа string, а у started - number (хотя это может быть и int или long и т.д.)

Берём твою ошибОчку:
[json.exception.type_error.302] type must be string, but is null

Ошибка в json типах (json.exception.type_error.302)
А именно: type must be string, but is null - Тип должен быть string, но он null
Означает это, что программа ожидала получить строку типа string, но по какой-то причине ей прилетел null
Значит, логично предположить, что проблема:
1) Либо в парсинге JSON
2) Либо в самом JSON


Что первоначально сделать?
Открыть глаза и увидеть что у тебя путаница в переменных:

if (curl) {
result = curl_easy_perform(curl);

if (result == CURLE_OK) {
// Парсим ответ сервера
all = json::parse(response);//тут ошибка

Я конечно не работал с плюсами и json, но ты создаёшь пустую переменную типа std::string response;
UPD: Увидел строку с: CURLOPT_WRITEDATA, &response
Скорее всего у тебя json внутри переменной result.

ЕСЛИ ЭТО НЕ ТАК, ТО:
1) Проверь что в переменной result у тебя находиться json (Привет отладчик !!!)
2) Если так, то вставляй его в сайт:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Далее убедись что поле "Status" и "SubEndTime" находятся внутри обьекта json и не обёрнуты внутри других массивов или обьектов и у них поля имеют данные типа string
1615268934337.png
 
Начинающий
Статус
Оффлайн
Регистрация
12 Ноя 2020
Сообщения
20
Реакции[?]
5
Поинты[?]
0
zryx
Ну так всё просто друк ?
Вот возьмём простую json-ку
Посмотреть вложение 136420
Изначале у нас json - это JObject (Обьект JSON)
Внутри него у нас есть поля: lobby_oid и started
Значение у lobby_oid - это поле типа string, а у started - number (хотя это может быть и int или long и т.д.)

Берём твою ошибОчку:
[json.exception.type_error.302] type must be string, but is null

Ошибка в json типах (json.exception.type_error.302)
А именно: type must be string, but is null - Тип должен быть string, но он null
Означает это, что программа ожидала получить строку типа string, но по какой-то причине ей прилетел null
Значит, логично предположить, что проблема:
1) Либо в парсинге JSON
2) Либо в самом JSON


Что первоначально сделать?
Открыть глаза и увидеть что у тебя путаница в переменных:

if (curl) {
result = curl_easy_perform(curl);

if (result == CURLE_OK) {
// Парсим ответ сервера
all = json::parse(response);//тут ошибка

Я конечно не работал с плюсами и json, но ты создаёшь пустую переменную типа std::string response;
UPD: Увидел строку с: CURLOPT_WRITEDATA, &response
Скорее всего у тебя json внутри переменной result.

ЕСЛИ ЭТО НЕ ТАК, ТО:
1) Проверь что в переменной result у тебя находиться json (Привет отладчик !!!)
2) Если так, то вставляй его в сайт:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Далее убедись что поле "Status" и "SubEndTime" находятся внутри обьекта json и не обёрнуты внутри других массивов или обьектов и у них поля имеют данные типа string
Посмотреть вложение 136421
спасибо огромное, там проблема была в том что у мужиков хвид сменился а если хвид другой то сервер возвращает только статус, а я пытался узнать что находится в SubEndTime хотя его нету, но все ровно огромно спасибо(классно оформил☺)
 
Сверху Снизу