如何使用 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;
添加到您的导入中。
我目前正在使用 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;
添加到您的导入中。