Rust Serde Json

背景

今天学习 The Rust Cookbook 的时候看到一段 JSON 解码的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#[macro_use]
extern crate serde_json;

use serde_json::{Value, Error};

fn main() -> Result<(), Error> {
let j = r#"{
"userid": 103609,
"verified": true,
"access_privileges": [
"user",
"admin"
]
}"#;

let parsed: Value = serde_json::from_str(j)?;

let expected = json!({
"userid": 103609,
"verified": true,
"access_privileges": [
"user",
"admin"
]
});

assert_eq!(parsed, expected);

Ok(())
}

疑问

这里衍生出一个问题: “变量 expected 被一个宏 json! 的结果赋值, 那这个 expected 到底是什么类型?”

查看文档可以了解到这是一个 serde_json::value::Value.

那随之而来的就是另一个问题: 怎么把 Value 转换为实际类型.

举个例子, expected 中的 useridu64 版本应该怎么获取?

提取字段值

文档中说明了可以显式指定转换类型, 生成对应类型的值, 例如 T: Option<T>

1
assert_eq!(expected["userid"].as_u64().unwrap(), 103609);

转换为结构体

虽然对单一字段可以这样操作, 但是将读取的 json 字符串转换为一个结构体是更合适的选择:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
extern crate serde_json;

use serde::Deserialize;
use serde_json::Error;

#[derive(Debug, Deserialize)]
struct User {
userid: u64,
verified: bool,
access_privileges: Vec<String>,
}

fn main() -> Result<(), Error> {
let j = r#"{
"userid": 103609,
"verified": true,
"access_privileges": [
"user",
"admin"
]
}"#;

let parsed: User = serde_json::from_str(j)?;

assert_eq!(parsed.userid, 103609);

Ok(())
}