如何为chrono::DateTime<Utc>实现schemars::JsonSchema?
问题:包含
DateTime<Utc>的结构体无法自动派生JsonSchema 尝试为以下结构体派生JsonSchema:
use chrono::{DateTime, Utc}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Default, Clone, JsonSchema)] pub struct ArticleResponse { pub pub_time: Option<DateTime<Utc>>, }
编译时出现错误:
error[E0277]: the trait bound `DateTime<Utc>: JsonSchema` is not satisfied --> src/main.rs:4:50 | 4 | #[derive(Serialize, Deserialize, Default, Clone, JsonSchema)] | ^^^^^^^^^^ the trait `JsonSchema` is not implemented for `DateTime<Utc>`
解决方案
有三种常见方式可以解决这个问题:
1. 启用schemars的chrono特性
schemars crate 本身提供了对chrono类型的JsonSchema实现,但需要显式启用对应特性。修改你的Cargo.toml中schemars的依赖配置:
[dependencies] schemars = { version = "0.8", features = ["chrono"] } chrono = "0.4" serde = { version = "1.0", features = ["derive"] }
修改后,原代码的derive(JsonSchema)就能正常工作,无需额外改动。
2. 手动为DateTime<Utc>实现JsonSchema
如果不想启用特性,可以手动实现JsonSchema trait:
use chrono::{DateTime, Utc}; use schemars::{gen::SchemaGenerator, schema::Schema, JsonSchema}; use serde::{Deserialize, Serialize}; // 手动实现DateTime<Utc>的JsonSchema impl JsonSchema for DateTime<Utc> { fn schema_name() -> String { "DateTimeUtc".to_string() } fn json_schema(gen: &mut SchemaGenerator) -> Schema { // 生成字符串类型的schema,因为DateTime序列化后通常是RFC3339格式的字符串 String::json_schema(gen) } } #[derive(Serialize, Deserialize, Default, Clone, JsonSchema)] pub struct ArticleResponse { pub pub_time: Option<DateTime<Utc>>, }
3. 使用schemars(with)属性指定替代类型
在字段上添加#[schemars(with = "String")],让schemars用String的schema来替代DateTime<Utc>的schema,同时不影响serde的序列化行为:
use chrono::{DateTime, Utc}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Default, Clone, JsonSchema)] pub struct ArticleResponse { #[schemars(with = "String")] pub pub_time: Option<DateTime<Utc>>, }
这种方式适合只需要特定字段使用替代schema的场景。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

