我有一个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/