我有一个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可以比崩溃程序更轻松地处理此问题。

有什么建议如何处理这种情况?例如,是否有更好的方法来处理错误?

杰森消息:

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

最佳答案

没有RapidJSON专家,但是根据文档(http://rapidjson.org/md_doc_tutorial.html


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


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

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

关于c++ - 当json值应为INT但以字符串类型发送时,rapidjson崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56654894/

10-13 06:29