如何使用 Serde 序列化具有顶级键的结构?

How to serialize a struct with a top-level key with Serde?

我目前正在使用 Rocket 开发 Web API,它使用以下结构进行错误响应:

#[derive(Serialize, Deserialize)]
pub struct ErrorResponse {
    code: u16,
    reason: &'static str,
    #[serde(skip_serializing_if = "Option::is_none")]
    description: Option<String>,
}

实际上,序列化此结构会产生 json 类似于:

{
  "code": 400,
  "reason": "Bad Request"
}

我希望以这种方式对其进行序列化:

{
  "error": {
    "code": 400,
    "reason": "Bad Request"
  }
}

在不使用两种不同结构的情况下最简单的方法是什么?

预先感谢您的帮助!

我能想到的最简单的方法是将您的结构包装在具有单个结构变体的 enum 中:

#[derive(Serialize, Deserialize)]
pub enum ErrorResponseWrapper {
    #[serde(rename = "error")]
    ErrorResponse {
        code: u16,
        reason: &'static str,
        #[serde(skip_serializing_if = "Option::is_none")]
        description: Option<String>,
    }
}

令人讨厌的是类型和构造函数现在必须有不同的名称。 IE。如果一个函数接受一个 ErrorResponse 它现在必须接受一个 ErrorResponseWrapper (尽管你可能想要一个比那个更好的名字),但是你必须用 [=14= 构造这样一个值] 变体。幸运的是,您至少可以将 use ErrorResponseWrapper::ErrorResponse; 添加到您的导入中。

Playground