2016-01-03 3 views
6

Я хочу создать строку json с помощью quickjson. Но у меня есть ошибка: не удалось конвертировать std::string в rapidjson::Type.Как добавить строки строки в документ quickjson

int x = 111; 
string className = "myclass"; 

Document doc; 
auto& allocator = doc.GetAllocator(); 

doc.AddMember("x", Value().SetInt(x), allocator); 
doc.AddMember("className", className, allocator); 

unordered_map<string, string>& map = sprite->toMap(); 
for (const auto& pair : map) { 
    Value key(pair.first.c_str(), pair.first.size(), allocator); 
    doc.AddMember(key, pair.second, allocator); 
} 

StringBuffer sb; 
Writer<StringBuffer> writer(sb); 

doc.Accept(writer); 
log("json string: %s", sb.GetString()); 

ответ

4

Если #define RAPIDJSON_HAS_STDSTRING 1 (до включения заголовочных файлов quickjson или определенных при компиляции флагов), для std::string есть несколько дополнительных API.

Для того, чтобы "копировать-строки" (выделенные дубликаты исходных строк) из std::string, вы можете использовать конструктор с распределителем:

for (auto& pair : map) { 
    rapidjson::Value key(pair.first, allocator); 
    rapidjson::Value value(pair.second, allocator); 
    doc.AddMember(key, value, allocator); 
} 

или сделать его единственное утверждение:

for (auto& pair : map) 
    doc.AddMember(
     rapidjson::Value(pair.first, allocator).Move(), 
     rapidjson::Value(pair.second, allocator).Move(), 
     allocator); 

Если вы считаете, что время жизни строк больше, чем doc, тогда вы можете использовать «const-string», что проще и эффективнее:

for (auto& pair : map) 
    doc.AddMember(
     rapidjson::StringRef(pair.first), 
     rapidjson::StringRef(pair.second), 
     allocator); 

Я думаю, что макрос RAPIDJSON_HAS_STDSTRING должны быть документированы лучше ...

+0

#define RAPIDJSON_HAS_STDSTRING 1! – waas1919

1

Теперь я понимаю, что я сделал 2 ошибки:
1. Я должен вызывать doc.SetObject(); после doc создается.
2. How to create string in rapidjson.

Document doc; 
doc.SetObject(); 
auto& allocator = doc.GetAllocator(); 

rapidjson::Value s; 
s = StringRef(className.c_str()); 
doc.AddMember("className", s, allocator); 

auto& map = sprite->toJson(); 
for (auto& pair : map) { 
    rapidjson::Value key(pair.first.c_str(), pair.first.size(), allocator); 
    rapidjson::Value value(pair.second.c_str(), pair.second.size(), allocator); 
    doc.AddMember(key, value, allocator); 
} 

Должен быть какой-то лучший способ сделать это.