rapidjson - изменить ключ на другое значение
Вот привет мир Rapidjson. Как я могу изменить ключ "hello"
в "goodbye"
и получить строку из JSON? Я имею в виду, я хочу разобрать JSON, изменить некоторые ключи и вернуть строку JSON, как {"goodbye" : "world"}
,
const char json[] = "{ \"hello\" : \"world\" }";
rapidjson::Document d;
d.Parse<0>(json);
2 ответа
Решение
const char *json = R"({"hello": "world"})";
rapidjson::Document d;
d.Parse<0> (json);
rapidjson::Value::Member* hello = d.FindMember ("hello"); if (hello) {
d.AddMember ("goodbye", hello->value, d.GetAllocator());
d.RemoveMember ("hello");
}
typedef rapidjson::GenericStringBuffer<rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<>> StringBuffer;
StringBuffer buf (&d.GetAllocator());
rapidjson::Writer<StringBuffer> writer (buf, &d.GetAllocator());
d.Accept (writer);
json = buf.GetString();
PS Вероятно, вам следует скопировать json
впоследствии, потому что его память будет освобождена вместе с d
,
PPS Вы также можете заменить имя поля на месте, не удаляя его:
rapidjson::Value::Member* hello = d.FindMember ("hello");
if (hello) hello->name.SetString ("goodbye", d.GetAllocator());
Или во время итерации:
for (auto it = d.MemberBegin(); it != d.MemberEnd(); ++it)
if (strcmp (it->name.GetString(), "hello") == 0) it->name.SetString ("goodbye", d.GetAllocator());
В моем случае есть ключевой словарь с именем keyDict
который хранит значения, которыми должны быть заменены ключи объекта.
std::string line;
std::map<std::string, int> keyDict;
.....................
.........................
rapidjson::Document doc;
doc.Parse<0>(line.c_str());
rapidjson::Value::MemberIterator itr;
for (itr = doc.MemberonBegin(); itr != doc.MemberonEnd(); ++itr)
{
std::string keyCode = std::to_string(keyDict[itr->name.GetString()]);
itr->name.SetString(keyCode.c_str(), keyCode.size(), doc.GetAllocator());
}