在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——"是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#"{ "kid":"kid-value", "kty":"RSA", "use":"sig", "n":"n-value", "e":"e-value" }"#; // 第一步:替换HTML转义的双引号为正常双引号 let json_str = jwk_like_str.replace(""", "\""); // 反序列化为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#"{ "kid":"kid-value", "kty":"RSA", "use":"sig", "n":"n-value", "e":"e-value" }"#; let json_str = jwk_like_str.replace(""", "\""); // 直接反序列化为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
相关产品推荐
相关产品推荐

