rapidjson - 使用嵌套字段递归更改键值

时间:2016-03-02 00:43:41

标签: c++ rapidjson

我有一个嵌套对象和对象数组的Json记录,这些字段中的键包含空格,我想将所有空格更改为_,所以我必须迭代json对象中的所有键。

我的想法是编写深度优先搜索以使用ConstMemberIterator迭代所有嵌套键,我的问题是如何通过给定迭代器来更改键?

以下示例代表了我的想法:

void DFSReplaceSpaceInKeys(Value::ConstMemberIterator& itr) {
    // Replace space in nested key
    std::string s(itr->name.GetString());
    std::replace(s.begin(), s.end(), ' ', '_');
    // set new string to key
    itr->name.SetString(s, ?.GetAllocator());  // <----- How can I get the document allocator?
    std::cout << "new key: " << itr->name.GetString() << std::endl;
    // recursive call in DFS
    if (itr->value.GetType() == Type::kObjectType) {
        DFSReplaceSpaceInKeys(itr->value.GetObject().MemberBegin());
    }
}

Json记录示例:

{
   "a": {"b": [{"c": [...]}, {...}]
}

2 个答案:

答案 0 :(得分:2)

您可以将分配器作为参数传递。我还认为你最好通过Value&代表一个节点。

void DFSReplaceSpaceInKeys(Value& value, Value::AllocatorType& allocator) {
    if (value.IsObject()) {
        for (Value::ConstMemberIterator itr = value.MemberBegin(); itr != MemberEnd(); ++itr)
        {
            // Modify itr->name here...
            DFSReplaceSpaceInKeys(itr->value, allocator);
        }
    }
    else if (value.IsArray()) {
        for (Value::ConstIterator itr = value.Begin(); itr != value.End(); ++itr)
            DFSReplaceSpaceInKeys(*itr, allocator);
    }
}

// ...
Document d;
DFSReplaceSpaceInKeys(d, d.GetAllocator());

如果您只需要执行上述任务,您可以使用SAX API,这可以更容易,更快捷。检查capitalize示例。

答案 1 :(得分:0)

rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
auto news_obj= news_info["news_feature"].GetObject();
auto title_keyword = news_obj.FindMember ("title_keyword");
if (title_keyword != news_obj.MemberEnd()) {
   title_keyword->name.SetString ("title_keywords", allocator);
}