你没有指定 Rust 字符串应该包含什么。此解决方案将保持值部分与它们在 JSON 中的完全相同,包括字符串周围的尾随数字和引号。这是运行这段代码的结果:
[src/main.rs:15] map = {
"key1": "\"value1\"",
"key2": "0",
"key3": "6.7",
"key4": "0.000",
}
use serde::de::*;
use std::collections::HashMap;
fn main() {
let j = r#"
{
"key1": "value1",
"key2": 0,
"key3": 6.7,
"key4": 0.000
}"#;
let mut deser = serde_json::Deserializer::from_str(j);
let map = deser_hashmap(&mut deser).unwrap();
dbg!(map);
}
fn deser_hashmap<'de, D>(deserializer: D) -> Result<HashMap<String, String>, D::Error>
where
D: Deserializer<'de>,
{
struct MapVisitor;
impl<'de> Visitor<'de> for MapVisitor {
type Value = HashMap<String, String>;
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str("a map")
}
fn visit_map<A>(self, mut access: A) -> Result<Self::Value, A::Error>
where
A: MapAccess<'de>,
{
let mut values = HashMap::new();
// We use RawValue here to access the JSON value exactly as it is occuring in the input.
while let Some((key, value)) = (access.next_entry())?
.map(|(k, v): (String, &'de serde_json::value::RawValue)| (k, v.get().to_owned()))
{
values.insert(key, value);
}
Ok(values)
}
}
let visitor = MapVisitor;
deserializer.deserialize_map(visitor)
}
Code on Playground