使用嵌套字段递归更改键值
recursively change key value with nested field
我有一个包含嵌套对象和对象数组的 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,它可以更容易、更快捷。检查大写示例。
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);
}
相关文章:
- 使用递归的数组的最小值.这是怎么回事
- 使用递归时获取变量的奇怪值
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 以C++递归方式查找向量中的最大值
- C++类 - 初始化列表 - 递归 - 按值传递
- 棘手的按值传递和按引用递归问题传递
- 此递归函数的每次迭代的值存储在哪里?
- 在递归中返回完整值
- 从递归函数 C++ 返回多个值
- 递归函数,用于查找 2 个整数之间的最大值
- 为什么递归 constexpr 模板值无法编译?
- 递归如何获取以前的值?
- 无法将枚举值传递给递归模板 (C++)
- 如何使用迭代器在 c++ 中的递归函数中传递值?
- 有没有办法在递归中使用指针来查找数组的最小值?
- Fibbonaci 递归代码返回错误值,始终返回下一个数字
- C 递归找到数组的最小值
- 递归函数反向输出值
- 如何在递归中仅使用最终值?
- 使用嵌套字段递归更改键值