我正在try 使用我的请求 struct 设置serde,以将其转换为JSON,以便将其传递给API:

#[serde_with::skip_serializing_none]
#[derive(Serialize, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub struct Request {
    #[serde(with = "http_serde::uri")]
    url: http::Uri,
    http_response_body: Option<bool>,
    #[serde(with = "http_serde::method")]
    http_request_method: Option<http::Method>,
}

我希望有一些字段是可选的,如果它们是None,那么我只想从序列化中省略它们.我使用serde_with跳过None个字段,它适用于http_response_body: Option<bool>,但不适用于http_request_method: Option<http::Method>.我收到以下错误:

error[E0308]: mismatched types
   --> src\zyte.rs:7:10
    |
7   | #[derive(Serialize, Debug, Default)]
    |          ^^^^^^^^^
    |          |
    |          expected struct `Method`, found enum `Option`
    |          arguments to this function are incorrect
    |
    = note: expected reference `&Method`
               found reference `&'__a std::option::Option<Method>`
note: function defined here
   --> C:\Users\isaac\.cargo\registry\src\github.com-1ecc6299db9ec823\http-serde-1.1.2\src\lib.rs:237:12
    |
237 |     pub fn serialize<S: Serializer>(method: &Method, ser: S) -> Result<S::Ok, S::Error> {
    |            ^^^^^^^^^
    = note: this error originates in the derive macro `Serialize` (in Nightly builds, run with -Z macro-backtrace for more info)

For more information about this error, try `rustc --explain E0308`.
error: could not compile `rust-simple-scraper` due to previous error

我能做些什么才能让这件事起作用?

推荐答案

你可以用你自己的函数包装 crate 的method::serialize,这个函数接受&Option<Method>.

fn method_opt<S: Serializer>(method_opt: &Option<Method>, ser: S) -> Result<S::Ok, S::Error> {
    match method_opt {
        Some(method) => http_serde::method::serialize(method, ser),
        // This won't be encountered when using skip_serializing_none
        None => panic!("This should only be used with `serde_with::skip_serializing_none`"),
    }
}

然后将其用于序列化.

#[serde(serialize_with = "method_opt")]
http_request_method: Option<http::Method>,

如果不使用skip_serializing_none,可以将None分支更改为使用ser.serialize_none(),但这只适用于像JSON这样的简单格式.对serialize_some有不同处理的格式(如RON)最终将不一致.

如果要为该 struct 创建序列化和反序列化,则可以在一个模块中创建两个函数,如serde documentation (example)中所述.这将具有与http_serde::method模块相同的 struct .

Rust相关问答推荐

将JSON密钥转换为Polars DataFrame

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

如何为rust trait边界指定多种可能性

当对VEC;U8>;使用serde_json时,Base64编码是保护空间的好方法吗?

Rust 的多态现象.AsRef与Derf

失真图像图形捕获Api

如何在Rust中缩短数组

对于rustc编译的RISC-V32IM二进制文件,llvm objdump没有输出

Rust Option 的空显式泛型参数

我们可以在 Rust 切片中使用步骤吗?

内部值发生变化时 Rc 的行为

Rust/Serde/HTTP:序列化`Option`

如何将参数传递给Rust 的线程?

n 个范围的笛卡尔积

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

在使用大型表达式时(8k 行需要一小时编译),是否可以避免 Rust 中的二次编译时间?

传递 Option<&mut T> 时何时需要 mut

list 中没有指定目标 - 必须存在 src/lib.rs、src/main.rs、[lib] 部分或 [[bin]] 部分

为什么 `ref` 会导致此示例*取消引用*一个字段?