无法将 chrono::DateTime 从 JSON 反序列化

8
我遇到了一个有趣的问题。由于某种原因,serde无法从字符串中反序列化出与已序列化的chrono::DateTime<Utc>对象相同格式的内容(但如果我保存了包含该对象的变量,则可以解析成功)。
use chrono; // 0.4.11
use serde_json; // 1.0.48

fn main() {
    let date = chrono::Utc::now();
    println!("{}", date);

    let date_str = serde_json::to_string(&date).unwrap();
    println!("{}", date_str);

    let parsed_date: chrono::DateTime<chrono::Utc> = serde_json::from_str(&date_str).unwrap();
    println!("{}", parsed_date);

    assert_eq!(date, parsed_date);

    let date = "2020-03-28T16:29:04.644008111Z";
    let _: chrono::DateTime<chrono::Utc> = serde_json::from_str(&date).unwrap();
}

这里是程序演示链接:playground link 输出结果如下:
   Compiling playground v0.0.1 (/playground)
    Finished dev [unoptimized + debuginfo] target(s) in 1.01s
     Running `target/debug/playground`
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error("invalid type: integer `2020`, expected a formatted date and time string or a unix timestamp", line: 1, column: 4)', src/main.rs:17:44
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Standard Output

2020-03-28 17:57:04.222452521 UTC
"2020-03-28T17:57:04.222452521Z"
2020-03-28 17:57:04.222452521 UTC

为什么会发生这种情况?我应该如何处理?

1个回答

5

您需要输入有效的JSON格式,不要忘记使用双引号:

let date = "\"2020-03-28T16:29:04.644008111Z\"";

你可以使用 println!("{:?}", date_str); 查看它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接