2017-03-08 348 views
0

我想使用rapidjson加載JSON文檔。解析後,斷言doc.IsObject()失敗,我不明白爲什麼。 我非常肯定文件名是正確的,我測試了jsonContent:OK。Rapidjson:doc.IsObject()在解析後返回false,即使doc.GetType()返回kObjectType

下面是加載代碼:

std::ifstream file(filename); 
std::string jsonContent((std::istreambuf_iterator<char>(file)), (std::istreambuf_iterator<char>())); 
rapidjson::Document doc; 
doc.Parse < rapidjson::kParseStopWhenDoneFlag, rapidjson::UTF8<> >(jsonContent.c_str(), jsonContent.length()); 
assert(doc.IsObject()); 

這裏是加載的JSON:

{ 
"version": "170301", 
"lang": "en" 
} 

這裏是輸出:

MyTest: /home/dev/Projects/myproject/src/loadJson.cpp:85: void loadFile(const std::string &): Assertion `doc.IsObject()' failed. 
unknown location(0): fatal error in "MyTest": signal: SIGABRT (application abort requested)

我執行該用gdb,並得到了以下信息(斷言之前的斷點):

(gdb) p doc 
$1 = {<rapidjson::GenericValue<rapidjson::UTF8<char>, rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> >> = {static kDefaultArrayCapacity = 16, static kDefaultObjectCapacity = 16, data_ = {s = { 
     length = 2, hashcode = 2, 
     str = 0x30000006a5b48 <error: Cannot access memory at address 0x30000006a5b48>}, ss = { 
     str = "\002\000\000\000\002\000\000\000H[j\000\000"}, n = {i = {i = 2, 
      padding = "\002\000\000"}, u = {u = 2, padding2 = "\002\000\000"}, i64 = 8589934594, 
     u64 = 8589934594, d = 4.2439915829186759e-314}, o = {size = 2, capacity = 2, 
     members = 0x30000006a5b48}, a = {size = 2, capacity = 2, elements = 0x30000006a5b48}, f = { 
     payload = "\002\000\000\000\002\000\000\000H[j\000\000", flags = 3}}}, 
    static kDefaultStackCapacity = 1024, allocator_ = 0x7fff00000000, ownAllocator_ = 0x691460, 
    stack_ = {allocator_ = 0x691460, ownAllocator_ = 0x0, stack_ = 0x0, stackTop_ = 0x0, 
    stackEnd_ = 0x0, initialCapacity_ = 0}, parseResult_ = {code_ = **rapidjson::kParseErrorNone,** 
    offset_ = 0}} 
(gdb) p doc.GetType() 
$2 = rapidjson::kObjectType 
(gdb) p doc.IsObject() 
$3 = false 
(gdb) p jsonContent 
$4 = "{\n\t\"version\": \"170301\",\n\t\"lang\": \"en\"\n}\n\n" 

我嘗試了列出的所有變體here,並且我得到了與所有變體相同的斷言失敗。

回答

0

我無法重現通過下面的代碼問題:

#include <iostream> 
#include "rapidjson/document.h" 

int main() { 
    rapidjson::Document doc; 
    doc.Parse < rapidjson::kParseStopWhenDoneFlag, rapidjson::UTF8<> >("{\"version\": \"170301\",\"lang\": \"en\"}"); 
    std::cout << doc.IsObject() << std::endl; 
}