如何在Rust中实现将JSON所有数字字段转为字符串的函数?
在Rust中将JSON所有数字字段转为字符串
需求说明
需要实现一个函数,接收任意结构的JSON字符串,将其中所有数字类型的字段转换为字符串类型,其余字段保持原结构和类型不变。函数签名要求如下:
pub fn convert_all_numbers_to_string(json: &str) -> String
示例
输入:
{"foo": 18446744073709551615}
输出:
{"foo": "18446744073709551615"}
输入:
{ "some": [{ "deeply": { "nested": [{ "path": 123 }] } }] }
输出:
{ "some": [{ "deeply": { "nested": [{ "path": "123" }] } }] }
实现方案
使用serde_json库处理动态JSON结构,它提供的Value类型可表示任意JSON数据,支持递归遍历和修改。
步骤1:添加依赖
在Cargo.toml中引入依赖:
[dependencies] serde_json = "1.0"
步骤2:完整代码实现
核心逻辑是递归遍历JSON节点,将数字类型转为字符串,其他类型保持原样:
use serde_json::{Value, json}; pub fn convert_all_numbers_to_string(json: &str) -> String { // 解析输入JSON为Value结构 let mut value = match serde_json::from_str(json) { Ok(v) => v, Err(_) => return json!({}).to_string(), // 解析失败返回空对象,可按需调整错误处理 }; // 递归处理所有数字节点 transform_numbers_to_strings(&mut value); // 序列化为格式化的JSON字符串 serde_json::to_string_pretty(&value).unwrap_or_else(|_| json!({}).to_string()) } fn transform_numbers_to_strings(value: &mut Value) { match value { // 数字类型转字符串 Value::Number(n) => { *value = Value::String(n.to_string()); } // 对象类型:遍历所有键值对递归处理 Value::Object(obj) => { for (_, v) in obj.iter_mut() { transform_numbers_to_strings(v); } } // 数组类型:遍历每个元素递归处理 Value::Array(arr) => { for v in arr.iter_mut() { transform_numbers_to_strings(v); } } // 其他类型(字符串、布尔、Null)无需修改 _ => {} } } // 测试案例 #[cfg(test)] mod tests { use super::*; #[test] fn test_simple_number() { let input = r#"{"foo": 18446744073709551615}"#; let expected = r#"{ "foo": "18446744073709551615" }"#; assert_eq!(convert_all_numbers_to_string(input), expected); } #[test] fn test_nested_structure() { let input = r#"{ "some": [{ "deeply": { "nested": [{ "path": 123 }] } }] }"#; let expected = r#"{ "some": [ { "deeply": { "nested": [ { "path": "123" } ] } } ] }"#; assert_eq!(convert_all_numbers_to_string(input), expected); } #[test] fn test_mixed_types() { let input = r#"{ "int": 42, "float": 3.14, "string": "hello", "bool": true, "null": null, "array": [1, 2.5, "test"] }"#; let expected = r#"{ "int": "42", "float": "3.14", "string": "hello", "bool": true, "null": null, "array": [ "1", "2.5", "test" ] }"#; assert_eq!(convert_all_numbers_to_string(input), expected); } }
补充说明
- 错误处理:当前代码在解析/序列化失败时返回空对象,可改为返回
Result<String, serde_json::Error>让调用者自行处理错误。 - 格式化:使用
to_string_pretty生成带缩进的JSON,若需紧凑格式可替换为to_string。 - 精度保留:所有数字类型(整数、浮点数、超大整数)都会转为原始字符串表示,不会丢失精度。
内容的提问来源于stack exchange,提问作者onyb
相关产品推荐
相关产品推荐

