如何在结构体的自定义序列化器中使用 serde serialize_with

问题描述 投票:0回答:1

我有以下代码,它按预期工作。

use serde::{ Serialize, Serializer };

// Define your struct with optional fields.
#[derive(Serialize)]
struct MyStruct {
    field1: i32,
    field2: Option<String>,
    #[serde(serialize_with = "custom_serialize_field3")]
    field3: Option<i32>,
    field4: i32,
    field5: Option<String>,
    custom_field: Option<String>,
}

// Define a custom serialization function for field3.
fn custom_serialize_field3<S>(field3: &Option<i32>, serializer: S) -> Result<S::Ok, S::Error>
    where S: Serializer
{
    // Implement custom serialization logic for field3 here
    match field3 {
        Some(value) => serializer.serialize_i32(*value),
        None => serializer.serialize_i32(0),
    }
}

fn main() {
    let data = MyStruct {
        field1: 42,
        field2: Some("Hello".to_string()),
        field3: None,
        field4: 99,
        field5: Some("World".to_string()),
        custom_field: Some("CustomValue".to_string()), // Set a custom value here
    };

    let serialized = serde_json::to_string(&data).expect("Serialization failed");

    println!("{}", serialized);

    let data2 = MyStruct {
        field1: 42,
        field2: Some("Hello".to_string()),
        field3: Some(1000),
        field4: 99,
        field5: Some("World".to_string()),
        custom_field: Some("CustomValue".to_string()), // Set a custom value here
    };

    let serialized2 = serde_json::to_string(&data2).expect("Serialization failed");

    println!("{}", serialized2);
}

工作游乐场

现在我有一个条件,当

field3
field5
都设置时,我们不应该序列化并返回错误。

error: cannot find attribute `serde` in this scope
 --> src/main.rs:7:7
  |
7 |     #[serde(serialize_with = "custom_serialize_field3")]
  |       ^^^^^
  |
  = note: `serde` is in scope, but it is a crate, not an attribute

为此,我尝试使用自定义序列化器作为结构,但出现错误。我编写了以下代码并从 struct 中删除了

#[derive(Serialize)]

impl Serialize for MyStruct {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
        if self.field3.is_some() && self.field5.is_some() {
            return Err(serde::ser::Error::custom("Both field3 and field5 can't be present"));
        }

        let mut state = serializer.serialize_struct("MyStruct", 6)?;
        state.serialize_field("field1", &self.field1)?;
        state.serialize_field("field2", &self.field2)?;
        state.serialize_field("field3", &self.field3)?;
        state.serialize_field("field4", &self.field4)?;
        state.serialize_field("field5", &self.field5)?;
        state.serialize_field("custom_field", &self.custom_field)?;
        state.end()
    }
}

游乐场

rust serde
1个回答
0
投票

您告诉

serde
应该使用什么名称作为
serialize_field
方法的第一个参数,只需将您的自定义名称放在那里而不是
"field3"
,因此替换它:

        state.serialize_field("field3", &self.field3)?;

有了这个

        state.serialize_field("custom_serialize_field3", &self.field3)?;

并删除

#[serde(serialize_with = "custom_serialize_field3")]

© www.soinside.com 2019 - 2024. All rights reserved.