Сбой fastjson, когда значение JSON должно быть INT, но отправить как строковый тип - PullRequest
0 голосов
/ 18 июня 2019

У меня есть код C ++, который анализирует входящее сообщение json с использованием rapidjson.

Полученное сообщение json содержит одну пару ключ: значение («userID»: 100), где значение является целым числом.

Однако, если значение отправляется в виде строки «100», quickjson вывел из строя всю программу со следующей ошибкой:

Invalid response: { "error": "ERR_RATE_LIMIT"}
trading: ../../include/rapidjson/document.h:1737: int rapidjson::GenericValue<Encoding, Allocator>::GetInt() const [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>]: Assertion `data_.f.flags & kIntFlag' failed.
/home/ray/dev/trading_execution/src/trading/trading.run.sh: line 39:  2518 Aborted                 (core dumped) ./trading 1234

Я ожидаю, что rapidjson может справиться с этим более осторожно, чем сбоит программа.

Есть предложения, как справиться с этой ситуацией?Например, есть ли лучший способ обработать ошибку?

Json сообщение:

{
   "ctRequestId":   "cfa5511f-8c1a-492b-b81a-1462d03bbe99",
    "requestType":  "generic",  
    "userID":       100,                        
}

Код:

    userID          = getJSONInt(document,      "userID");      

    int getJSONInt(rapidjson::Document& document, const char* memberName)
    {
    int memberValue;

    try
    {
        if (document.HasMember(memberName))
        memberValue = document[memberName].GetInt();
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }

    return memberValue;
}

1 Ответ

3 голосов
/ 18 июня 2019

Нет эксперта по быстрому, но согласно документации (http://rapidjson.org/md_doc_tutorial.html)

Обратите внимание, что RapidJSON не выполняет автоматическое преобразование значений между типами JSON. Если значение является строкой, то недопустимо вызывать GetInt (), например. В режиме отладки оно не будет подтверждено. В режиме релиза поведение не определено. В следующих разделах мы обсудим детали запросов отдельных типов.

Если вы посмотрите таблицу в разделе «Номер запроса» связанного документа, вы можете найти некоторую функцию-член, которую можно использовать для проверки типа перед его извлечением. В вашем случае вы можете попробовать IsInt()

Редактировать: для конкретного случая использования IsUint / GetUint может быть более подходящим, как указано в комментариях

...