使用serde,如何在反序列化时保留序列化数据的副本?

cry*_*nic 1 rust serde

我正在使用 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)

评论里可以填什么内容????

jon*_*sbb 5

/*
[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。