Проблема с десерализацией некоторых полей в 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>() по сравнению с чем-то другим?

, 👍-1

Обсуждение

Может быть, он захлебывается экранированными кавычками (\") в последней строке?, @Edgar Bonet

@EdgarBonet спасибо за мысль. Я попытался удалить кавычки (из результата json), это не изменило результат., @user1529413


1 ответ


0

Оказывается, здесь есть средство устранения неполадок 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...

это срабатывало каждый раз для каждой строки

,