我正在使用 Rust 和 Serde。假设我有一个结构体想要保留创建它的 JSON 数据的副本,也许这样它就可以在其他地方重新发送相同的 JSON,而无需重新序列化。(它并不像只保留原始 JSON 数据的副本那么简单,因为该结构可能位于更多 JSON 数据中。)示例:
#[derive(Deserialize)]
struct LargerStruct {
value: i32,
inner: InnerStruct,
}
#[derive(Deserialize)]
struct InnerStruct {
this_json: String,
inner_value: i32,
}
fn main() {
let json = r#"
{
"value": 42,
"inner": { "inner_value": 100 }
}
"#;
let val: LargerStruct = // ???
assert_eq!(&val.inner.this_json, r#"{ "inner_value": 100 }"#);
}
Run Code Online (Sandbox Code Playgroud)
评论里可以填什么内容????
/*
[dependencies]
serde.version = "*"
serde.features = ["derive"]
serde_json.version = "*"
serde_json.features = ["raw_value"]
*/
use serde::*;
use serde_json::value::RawValue;
#[derive(Deserialize)]
struct LargerStruct {
value: i32,
inner: InnerStruct,
}
struct InnerStruct {
this_json: String,
inner_value: i32,
}
impl<'de> Deserialize<'de> for InnerStruct {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let this_json: Box<RawValue> = Deserialize::deserialize(deserializer)?;
#[derive(Deserialize)]
struct InnerStruct {
inner_value: i32,
}
let this: InnerStruct =
serde_json::from_str(this_json.get()).map_err(serde::de::Error::custom)?;
Ok(Self{
this_json: this_json.get().to_string(),
inner_value: this.inner_value,
})
}
}
fn main() {
let json = r#"
{
"value": 42,
"inner": { "inner_value": 100 }
}
"#;
let val: LargerStruct = serde_json::from_str(json).unwrap();
assert_eq!(&val.inner.this_json, r#"{ "inner_value": 100 }"#);
}
Run Code Online (Sandbox Code Playgroud)
您可以使用该serde_json::value::RawValue类型以原始形式捕获原始 JSON。该代码使用自定义Deserialize实现来InnerStruct实现捕获 JSON 和反序列化的目标。serde_json它通过再次调用实现内捕获的 JSON 来反序列化结构Deserialize。这是必要的,因为 是deserializer在反序列化之后被消耗的RawValue。