gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:44:01 24 4
gpt4 key购买 nike

我有一个包含嵌套对象和对象数组的 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": [...]}, {...}]
}

最佳答案

您可以将分配器作为参数传递。我还认为您最好传递 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示例。

关于c++ - rapidjson - 使用嵌套字段递归更改键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35736425/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com