当json值应为INT但以字符串类型发送时,rapidjson崩溃了

时间:2019-06-18 18:18:06

标签: c++ c++11 rapidjson

我有一个C ++代码,可以使用Rapidjson解析传入的JSON消息。

收到的json消息包含一个key:value对(“ userID”:100),其中值是整数。

但是,如果该值以字符串'100'的形式发送,则Rapidjson使整个程序崩溃,并出现以下错误:

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;
}

2 个答案:

答案 0 :(得分:3)

不是Rapidjson的专家,但根据文档(http://rapidjson.org/md_doc_tutorial.html

  

请注意,RapidJSON不会自动在JSON类型之间转换值。例如,如果值是字符串,则调用GetInt()是无效的。在调试模式下,它将使断言失败。在发布模式下,行为是不确定的。   在以下各节中,我们讨论有关查询单个类型的详细信息。

如果您在链接文档的“查询编号”部分中的表中查找,则会找到一些成员函数,可在提取该成员函数之前对其进行测试。您可能需要尝试IsInt()

编辑:对于特定用例,如注释中所指出的,IsUint / GetUint可能更合适

答案 1 :(得分:0)

尝试一下:

{
...,
...,
"UserId" : "100"  // note double quotes for 100
}

如果“ UserId”的值是字符串,则使用GetString()查询而不是GetInt()来通过断言测试来查询它。