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

标签 rust 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(虽然你可能想要一个更好的名字),但你必须构造这样一个值使用 ErrorResponseWrapper::ErrorResponse 变体。幸运的是,您至少可以将 use ErrorResponseWrapper::ErrorResponse; 添加到您的导入中。

Playground

关于rust - 如何使用 Serde 序列化具有顶级键的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68396341/

相关文章:

generics - 通过特征而不是结构参数化变量?

rust - 反序列化可能是字符串数组或常量字符串的值?

rust - 如何在自定义结构序列化程序中嵌套字段?

enums - 在宏中匹配类似元组的枚举变量,其中枚举类型和变量是元变量: how do I write the matching pattern?

json - 如何有条件地将 JSON 反序列化为枚举的两个不同变体?

unit-testing - serde 实现中的模拟实例

rust - 使用 serde 反序列化数组时跳过空对象

rust - 在字符串上创建闭包返回迭代器

serialization - 如何将 BSON 反序列化为通用对象?

rust - 为什么没有为明确实现的类型实现特征?