Проблема с десерализацией некоторых полей в JSONRequest
Мне почти успешно удается ПОЛУЧИТЬ большой двоичный объект json и распечатать его на консоли. Кажется, он терпит неудачу в некоторых строковых полях, я предполагаю, из-за длины. Есть какие-нибудь мысли / идеи / предложения, чтобы это сработало?
Запрошенный двоичный объект json (я могу видеть всю эту строку из консоли, она выделена здесь для удобства чтения). Вся длина исходной строки составляет 597 символов.
{
"expand":"schema,names"
,"startAt":0
,"maxResults":50
,"total":2
,"issues":[{
"expand":"operations,versionedRepresentations,editmeta,changelog,renderedFields"
,"id":"94245"
,"self":"https://myServer.atlassian.net/rest/api/3/issue/9425"
,"key":"BP-4349"
,"fields":{
"summary":"QM: API Timeout Error on Checkout "
}
}
,{"expand":"operations,versionedRepresentations,editmeta,changelog,renderedFields"
,"id":"93129"
,"self":"https://myServer.atlassian.net/rest/api/3/issue/9319"
,"key":"BP-4078"
,"fields":{
"summary":"Search \"term\" options - broken in loader see sproc"
}
}]
}
Код, который я использую для извлечения этого объекта json, уменьшен настолько, насколько это возможно:
JsonRequest request(2048);
//...snip...// (inside JsonRequest object)
WiFiClientSecure *client = new WiFiClientSecure;
HTTPCliernt download_client;
download_client.begin(*client, url);
download_client.collectHeaders(headerKeys, 5);
download_client.setAuthorizationHeader(authValue);
download_client.setUserAgent( HARDWARE_NAME );
int httpCode = download_client.GET();
if(httpCode == HTTP_CODE_OK)
{
String result = download_client.getString();
download_client.end();
client->stop();
dsError = deserializeJson(*this, (uint8_t*) (result.c_str()) ); //this refers to this object which is the JsonRequest
if(!dsError)
{
...
return true;
.....
(outside JsonRequest object, request is a deseralized `SpiRamJsonDocument` )
//...snip...//
int total = request["total"].as<int>(); //working: 2
int startAt = request["startAt"].as<int>(); //working: 0
int maxResults = request["maxResults"].as<int>(); //working: 50
int totalRecords = total + startAt;
for(; startAt < totalRecords && maxResults > 0; startAt++, maxResults--)
{
log_i("%s: %s - %s"
,request["issues"][startAt]["key"].as<String>() //working: BP-4349
,request["issues"][startAt]["fields"]["summary"].as<String>() //broken? (garbage string)
,request["issues"][startAt]["self"].as<String>() //broken? (garbage string)
);
}
Я не знаю, почему некоторые строки сработали, а некоторые - нет. Я предполагаю, что проблема заключается в длине строки?
Как бы вы предложили мне извлечь более длинные строки?
Как мне узнать, когда длина диктует использование .as<String>()
по сравнению с чем-то другим?
@user1529413, 👍-1
Обсуждение1 ответ
Оказывается, здесь есть средство устранения неполадок arduino json специально для этого типа проблем: https://arduinojson.org/v6/troubleshooter / вау, круто. Если у вас возникла аналогичная проблема, я бы начал с этого.
Это не решило мою проблему для меня, если я приведу типы к значению const char *.
...snip...
const char* x = request["issues"][startAt]["self"].as<const char *>()
log_i("%s", x);
...snip...
это срабатывало каждый раз для каждой строки
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Как выбрать альтернативные контакты I2C на ESP32?
- Драйверы для чипа последовательного порта CH9102X
- Как преобразовать форматированный оператор print в строковую переменную?
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Питание esp32cam от аккумулятора
- Контакты RX и TX на esp32
- ESP32: отключить детектор отключения питания
Может быть, он захлебывается экранированными кавычками (
\"
) в последней строке?, @Edgar Bonet@EdgarBonet спасибо за мысль. Я попытался удалить кавычки (из результата json), это не изменило результат., @user1529413