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

在Rust中如何将JSON字符串转HashMap及提取JWK的e和n值

问题1:如何在Rust中将JSON字符串转换为HashMap?

Rust里处理JSON最常用的工具就是serde_json库,搭配serde一起用,这几乎是生态里的标配。要把JSON字符串转成HashMap,步骤很清晰:

1. 先在Cargo.toml里添加依赖

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

2. 编写转换代码

你可以把JSON字符串直接反序列化成HashMap<String, serde_json::Value>,Value类型能兼容JSON里的所有数据类型(字符串、数字、布尔值等),适合处理结构不固定的JSON:

use serde_json::Result;
use std::collections::HashMap;

fn json_to_hashmap() -> Result<()> {
    // 示例JSON字符串
    let json_str = r#"{"name": "Alice", "age": 30, "is_student": false}"#;
    
    // 反序列化为HashMap
    let map: HashMap<String, serde_json::Value> = serde_json::from_str(json_str)?;
    
    // 访问HashMap里的值,注意要做类型转换
    println!("Name: {}", map["name"].as_str().unwrap());
    println!("Age: {}", map["age"].as_u64().unwrap());
    println!("Is student: {}", map["is_student"].as_bool().unwrap());
    
    Ok(())
}

fn main() {
    json_to_hashmap().unwrap();
}

如果你的JSON结构是固定的,其实更推荐定义对应的结构体来反序列化(类型更安全,访问值也更方便),但如果是动态结构,HashMap就是最灵活的选择。


问题2:处理转义后的类JSON字符串并提取e/n值

你拿到的这个字符串是HTML转义后的JSON——&quot;是HTML里对双引号的转义字符,所以第一步得先把这些转义字符还原成正常的双引号,之后就可以用标准JSON工具处理了。给你两种实用方案:

方案一:转成HashMap提取值

先还原转义字符,再反序列化成HashMap,然后直接取e和n的键值:

use serde_json::Result;
use std::collections::HashMap;

fn parse_jwk_str() -> Result<()> {
    // 你提供的类JSON字符串
    let jwk_like_str = r#"{ &quot;kid&quot;:&quot;kid-value&quot;, &quot;kty&quot;:&quot;RSA&quot;, &quot;use&quot;:&quot;sig&quot;, &quot;n&quot;:&quot;n-value&quot;, &quot;e&quot;:&quot;e-value&quot; }"#;
    
    // 第一步:替换HTML转义的双引号为正常双引号
    let json_str = jwk_like_str.replace("&quot;", "\"");
    
    // 反序列化为HashMap<String, String>(因为这里所有值都是字符串)
    let map: HashMap<String, String> = serde_json::from_str(&json_str)?;
    
    // 提取e和n的值
    let e = &map["e"];
    let n = &map["n"];
    
    println!("e的值:{}", e);
    println!("n的值:{}", n);
    
    Ok(())
}

fn main() {
    parse_jwk_str().unwrap();
}

方案二:定义结构体直接反序列化(更推荐)

如果这个JWK结构是固定的,直接定义一个结构体来反序列化,不仅类型安全,还能直接拿到e和n,不用手动处理HashMap的键:

use serde::Deserialize;
use serde_json::Result;

// 定义JWK结构体,只保留你需要的e和n字段(其他字段可以忽略)
#[derive(Deserialize, Debug)]
struct JWK {
    e: String,
    n: String,
    // 如果需要其他字段,比如kid、kty,直接加在这里就行
}

fn extract_jwk_values() -> Result<()> {
    let jwk_like_str = r#"{ &quot;kid&quot;:&quot;kid-value&quot;, &quot;kty&quot;:&quot;RSA&quot;, &quot;use&quot;:&quot;sig&quot;, &quot;n&quot;:&quot;n-value&quot;, &quot;e&quot;:&quot;e-value&quot; }"#;
    
    let json_str = jwk_like_str.replace("&quot;", "\"");
    // 直接反序列化为JWK结构体
    let jwk: JWK = serde_json::from_str(&json_str)?;
    
    println!("e的值:{}", jwk.e);
    println!("n的值:{}", jwk.n);
    
    Ok(())
}

fn main() {
    extract_jwk_values().unwrap();
}

额外提醒

有人可能会想用正则表达式直接提取e和n的值,但这种方式很脆弱——如果字符串格式稍有变化(比如空格、字段顺序改变),正则就可能失效。还是先转成标准JSON再处理更可靠。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:23:01