gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:17:14 26 4
gpt4 key购买 nike

我目前正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com