2016-03-01 115 views
3

我试图创建一个使用rapidjson的JSON,我遇到了一些意想不到的问题,无法生成正确的输出。rapidjson正确的JSON创建

我创建和填充像这样的文件:

Document d; 
d.SetObject(); 

rapidjson::Document::AllocatorType& allocator = d.GetAllocator(); 

size_t sz = allocator.Size(); 

d.AddMember("version", 1, allocator); 
d.AddMember("testId", 2, allocator); 
d.AddMember("group", 3, allocator); 
d.AddMember("order", 4, allocator); 

Value tests(kArrayType); 
Value obj(kObjectType); 
Value val(kObjectType); 

obj.AddMember("id", 1, allocator); 

string description = "a description"; 
val.SetString(description.c_str(), static_cast<SizeType>(description.length()), allocator); 
obj.AddMember("description", val, allocator); 

string help = "some help"; 
val.SetString(help.c_str(), static_cast<SizeType>(help.length()), allocator); 
obj.AddMember("help", val, allocator); 

string workgroup = "a workgroup"; 
val.SetString(workgroup.c_str(), static_cast<SizeType>(workgroup.length()), allocator); 
obj.AddMember("workgroup", val, allocator); 

val.SetBool(true); 
obj.AddMember("online", val, allocator); 

tests.PushBack(obj, allocator); 
d.AddMember("tests", tests, allocator); 

// Convert JSON document to string 
rapidjson::StringBuffer strbuf; 
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(strbuf); 
d.Accept(writer); 

当我运行这段代码,我期待获得此JSON:

{ 
    "version": 1, 
    "testId": 2, 
    "group": 3, 
    "order": 4, 
    "tests": [ 
     { 
      "id": 1, 
      "description": "a description", 
      "help": "some help", 
      "workgroup": "a workgroup", 
      "online": true 
     } 
    ] 
} 

但实际产生的输出...

{ 
    "version": 1, 
    "testId": 2, 
    "group": 3, 
    "order": 4, 
    "tests": [ 
     { 
      "id": 1, 
      "description": "a description", 
      "help": "some help", 
      "workgroup": "a workgroup", 
      "online": tr{ 
    "version": 1, 
    "testId": 2, 
    "group": 3, 
    "order": 4, 
    "tests": [ 
     { 
      "id": 1, 
      "description": "a description", 
      "help": "some help", 
      "workgroup": "a workgroup", 
      "online": true 
     } 
    ] 
} 

任何想法?

+0

你是否必须这样做''allocator''魔术?还是有重载,你可以在没有它们的情况下构建DOM?我的直觉告诉我,这看起来有点偏离。 – BitTickler

+0

除此之外,您多次重复使用相同的''val''实例。也许这是一个非使用案例。 – BitTickler

+0

从我可以告诉我,我只能从SetString调用中删除分配器,并没有任何效果。关于重复使用val,我已经尝试过不重用它,结果也是一样的。 –

回答

2

最后,我设法跟踪问题,直到我输出的字符串与OutputDebugString在VS.如果我保存了结果字符串(由GetString()给出),则输出如预期!

通过调试陷阱挫败我是!