2017-10-07 35 views
0

我有以下代码。如何使用rapidjason解析根中的数组

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。它让我回到数组元素的嵌套字符串。

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

上述替代的输出是:

{"k1":"1"} 

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

PS:有没有更好的杰森解析器的C++与简单的界面?

+1

“1” - 未INT - 它是一个字符串 - 所以你需要使用'd [i] [“k1”]。GetString()'。 Int将在不带引号的json中表示。从json中提取字符串“1”后,你可以使用stoi将它转换为int。 –

回答

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