Json::Value递归转换JSON键首字母大写:数组场景处理求助
解决JsonCpp中数组场景下的键首字母大写转换问题
原代码的核心问题是遇到数组时直接return,既中断了当前对象的键遍历,也完全没处理数组内部的嵌套元素。下面是修正后的完整实现,支持对象、数组的任意嵌套场景:
修正后的完整代码
#include <JsonCpp/json.h> #include <cctype> void change_keys(const Json::Value& oldJson, Json::Value& newJson) { if (oldJson.isObject()) { // 处理对象:遍历所有键,转换首字母后递归处理对应值 for (Json::ValueConstIterator it = oldJson.begin(); it != oldJson.end(); ++it) { std::string newKey = it.name(); if (!newKey.empty()) { // 用unsigned char避免std::toupper处理负数值的字符 newKey[0] = std::toupper(static_cast<unsigned char>(newKey[0])); } // 递归处理值,再赋值给新键对应的位置 change_keys(*it, newJson[newKey]); } } else if (oldJson.isArray()) { // 处理数组:遍历每个元素,递归处理后添加到新数组 newJson.resize(oldJson.size()); for (Json::ArrayIndex i = 0; i < oldJson.size(); ++i) { change_keys(oldJson[i], newJson[i]); } } else { // 基本类型(字符串、数字、布尔、null等)直接拷贝 newJson = oldJson; } }
关键修改说明
- 参数安全调整:将
oldJson改为const Json::Value&,严格保证原JSON对象不被修改,完全符合需求。 - 数组完整处理:
- 遇到数组时,先同步新数组的长度,再逐个遍历数组元素,对每个元素递归调用转换逻辑,不管元素是对象、嵌套数组还是基本类型。
- 移除了原代码中中断流程的
return,确保当前对象的所有键都能被处理。
- 边界安全处理:对空字符串键做了判断,避免访问
newKey[0]时出现越界错误。 - 逻辑优化:先递归处理值,再赋值给新键的位置,避免先拷贝原Value再修改的冗余操作。
测试验证
对于输入JSON:
{"result": { "main": [ { "free": 0, "total": 0 } ] }
调用change_keys后生成的新JSON与期望输出完全一致:
{"Result": { "Main": [ { "Free": 0, "Total": 0 } ] }
内容的提问来源于stack exchange,提问作者ipV4
相关产品推荐
相关产品推荐

