如何使用rapidjason在root中解析数组

时间:2017-10-07 07:26:41

标签: c++ rapidjson

我有以下代码。

Document d;
const char* json = "[{\"k1\":\"1\"}, {\"k1\":\"2\"}]";
d.Parse(json);
for (SizeType i = 0; i < d.Size(); i++) {
    cout << d[i]["k1"].GetInt() << "\n";
}

运行时我得到以下错误:

rapidjson/include/rapidjson/document.h:1700: int rapidjson::GenericValue<Encoding, Allocator>::GetInt() const [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>]: Assertion `data_.f.flags & kIntFlag' failed.

我想到的一种方法是使用接受stringBuffer的writer。它给了我一个数组元素的嵌套字符串。

 rapidjson::StringBuffer sb;
 rapidjson::Writer<rapidjson::StringBuffer> writer1( sb );
 d[0].Accept( writer1 );
 std::cout << sb.GetString() << std::endl;

以上替代方案的输出是:

{"k1":"1"}

我可以反馈字符串输出以上再次解析。有没有办法直接解析这个?

PS:有没有更好的jason解析器用于简单接口的c ++?

1 个答案:

答案 0 :(得分:0)

您,因为程序员应该知道您正在序列化或反序列化的JSON字符串的格式。看起来,在这种情况下,您正在考虑字符串值为整数。

现在,要解决此问题,您可以将它们视为字符串,然后使用标准C ++实用程序将这些字符串值转换为整数,或者您可以更新JSON字符串以包含整数。

第一种方法(尽管转换为int并不是以最好的方式完成):

Document d;
const char* json = "[{\"k1\":1}, {\"k1\":2}]";
d.Parse(json);
for (SizeType i = 0; i < d.Size(); i++) {
    int d;
    sscanf(d[i]["k1"].GetString(), "%d", &d);
    cout << d << "\n";
}

第二种方法:

Document d;
const char* json = "[{\"k1\":1}, {\"k1\":2}]";
d.Parse(json);
for (SizeType i = 0; i < d.Size(); i++) {
    cout << d[i]["k1"].GetInt() << "\n";
}