我有一个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;
}
答案 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()
来通过断言测试来查询它。