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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 00:06:23