やりたいこと
YYYY-MM-DD 形式のjson文字列をNaiveDateに変換したい
rust
1let json_str = r#" 2{ 3 "id": 1, 4 "date": "2021-03-15" 5}"#;
↓
rust
1#[derive(Serialize, Deserialize, Debug)] 2struct Record { 3 id: i32, 4 #[serde(with="yyyy_mm_dd_fmt")] 5 date: NaiveDate, 6}
現状のコード全体
rust
1mod yyyy_mm_dd_fmt { 2 use chrono::{NaiveDate}; 3 use serde::{self, Deserialize, Serializer, Deserializer}; 4 const FORMAT: &'static str = "%Y-%m-%d"; 5 6 pub fn serialize<S>(date: &NaiveDate, serializer: S) -> Result<S::Ok, S::Error> 7 where S: Serializer, 8 { 9 let s = format!("{}", date.format(FORMAT)); 10 serializer.serialize_str(&s) 11 } 12 13 pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error> 14 where D: Deserializer<'de>, 15 { 16 let s = String::deserialize(deserializer)?; 17 let nd = NaiveDate::parse_from_str(&s, FORMAT); 18 nd 19 } 20} 21 22use serde::{Serialize, Deserialize}; 23use chrono::NaiveDate; 24 25#[derive(Serialize, Deserialize, Debug)] 26struct Record { 27 id: i32, 28 #[serde(with="yyyy_mm_dd_fmt")] 29 date: NaiveDate, 30} 31 32fn main() { 33 let json_str = r#" 34 { 35 id:1, 36 date:"2021-03-15", 37 }"#; 38 let record: Record = serde_json::from_str(json_str).unwrap(); 39 println!("{:?}", record) 40}
きになっているところ
rust
1 pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error> 2 where D: Deserializer<'de>, 3 { 4 let s = String::deserialize(deserializer)?; 5 let nd = NaiveDate::parse_from_str(&s, FORMAT); 6 nd 7 }
↑ 返り値の型が違うのでここでこのまま返せないのはわかっているんですが、matchなりmap_errを使ったあとに、
どうやって chrono::ParseError
から Deserializer<'de>
オブジェクトを作ればよいのでしょう?
cargo build の結果
| 15 | pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error> | --------------------------- expected `std::result::Result<NaiveDate, <D as _::_serde::Deserializer<'de>>::Error>` because of return type ... 20 | nd | ^^ expected associated type, found struct `chrono::ParseError` | = note: expected enum `std::result::Result<_, <D as _::_serde::Deserializer<'de>>::Error>` found enum `std::result::Result<_, chrono::ParseError>` help: consider constraining the associated type `<D as _::_serde::Deserializer<'de>>::Error` to `chrono::ParseError` | 16 | where D: Deserializer<'de, Error = chrono::ParseError>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/15 08:25
2021/03/15 10:09 編集