You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
}

关键修改说明

  1. 参数安全调整:将oldJson改为const Json::Value&,严格保证原JSON对象不被修改,完全符合需求。
  2. 数组完整处理:
    • 遇到数组时,先同步新数组的长度,再逐个遍历数组元素,对每个元素递归调用转换逻辑,不管元素是对象、嵌套数组还是基本类型。
    • 移除了原代码中中断流程的return,确保当前对象的所有键都能被处理。
  3. 边界安全处理:对空字符串键做了判断,避免访问newKey[0]时出现越界错误。
  4. 逻辑优化:先递归处理值,再赋值给新键的位置,避免先拷贝原Value再修改的冗余操作。

测试验证

对于输入JSON:

{"result": {
            "main": [
                {
                    "free": 0,
                    "total": 0
                }
             ]
         }

调用change_keys后生成的新JSON与期望输出完全一致:

{"Result": {
            "Main": [
                {
                    "Free": 0,
                    "Total": 0
                }
             ]
         }

内容的提问来源于stack exchange,提问作者ipV4

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:25:21