编写CLI工具时,如何将serde_json Value的键转为camelCase?
处理任意JSON对象键转camelCase的方案
你可以借助serde自带的serde::case模块实现键的大小写转换,同时通过递归遍历serde_json::Value来适配任意结构的JSON,完全不需要强类型定义。
实现步骤
- 添加依赖:确保
serde启用case特征,同时引入serde_json:
[dependencies] serde = { version = "1.0", features = ["case"] } serde_json = "1.0"
- 递归转换函数:编写函数遍历JSON结构,对所有对象的键应用camelCase转换,嵌套的对象和数组也会被递归处理:
use serde::case::CamelCase; use serde_json::Value; fn convert_keys_to_camel_case(value: &Value) -> Value { match value { // 处理JSON对象:转换键为camelCase,递归处理值 Value::Object(obj) => { let mut new_obj = serde_json::Map::new(); for (key, val) in obj { let camel_key = CamelCase::convert(key); new_obj.insert(camel_key, convert_keys_to_camel_case(val)); } Value::Object(new_obj) } // 处理JSON数组:递归转换每个元素 Value::Array(arr) => { let new_arr = arr.iter() .map(convert_keys_to_camel_case) .collect(); Value::Array(new_arr) } // 基础类型(字符串、数字、布尔、null)直接返回 _ => value.clone(), } }
- 使用示例:读取JSON文件、转换并输出结果:
fn main() -> Result<(), Box<dyn std::error::Error>> { let json_content = std::fs::read_to_string("input.json")?; let original_json: Value = serde_json::from_str(&json_content)?; let camel_case_json = convert_keys_to_camel_case(&original_json); println!("{}", serde_json::to_string_pretty(&camel_case_json)?); Ok(()) }
补充说明
serde::case模块已经封装了成熟的大小写转换逻辑,能处理下划线、连字符分隔的键(比如user_name转userName,user-id转userId),无需自己实现转换规则。- 如果需要其他格式转换,只需替换
CamelCase为对应类型即可,比如SnakeCase、PascalCase等。
内容的提问来源于stack exchange,提问作者Luis Nell
相关产品推荐
相关产品推荐

