pat*_*oid 8 rust rust-chrono serde
我从外部 API 收到毫秒时间戳作为 JSON 字符串属性。
{"time":"1526522699918"}
Run Code Online (Sandbox Code Playgroud)
使用 Serde 将毫秒时间戳解析为字符串的最佳方法是什么?
该ts_milliseconds选项使用整数毫秒时间戳,但在使用字符串时会引发错误。
示例 - Rust 游乐场
{"time":"1526522699918"}
Run Code Online (Sandbox Code Playgroud)
错误信息:
Error("invalid type: string \"1526522699918\", expected a unix timestamp in milliseconds", line: 1, column: 23)'
Run Code Online (Sandbox Code Playgroud)
jon*_*sbb 10
使用from 的类型DateTime可以对of 的序列化进行抽象。有了它,您可以序列化为浮点数、整数或字符串或反序列化。您需要启用该功能。TimestampMilliSecondsserde_withchronoserde_with
第一个参数(此处String)配置序列化行为。在这种情况下,String这意味着DateTime将被序列化为包含 Unix 时间戳(以毫秒为单位)的字符串。
第二个参数(此处Flexible)允许配置反序列化行为。Flexible意味着它将从浮点数、整数和字符串反序列化而不返回错误。您可以使用它来main运行问题中的函数。另一个选项是Strict,它仅反序列化第一个参数的格式。对于此示例,这意味着它只会将时间反序列化为字符串,但在遇到整数时会返回错误。
use ::chrono::{DateTime, Utc};
use serde_with::TimestampMilliSeconds;
use serde_with::formats::Flexible;
#[serde_with::serde_as]
#[derive(serde::Deserialize, serde::Serialize)]
struct S {
#[serde_as(as = "TimestampMilliSeconds<String, Flexible>")]
time: DateTime<Utc>,
}
fn main() {
serde_json::from_str::<S>(r#"{"time":1526522699918}"#).unwrap(); // millisecond timestamp as a integer
serde_json::from_str::<S>(r#"{"time":"1526522699918"}"#).unwrap(); // millisecond timestamp as an string
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6494 次 |
| 最近记录: |