我目前正在使用 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;
添加到您的导入中。
关于rust - 如何使用 Serde 序列化具有顶级键的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68396341/