我们先看如何通过 to_string 方法将一个struct 工具 序列号
use serde::{Deserialize, Serialize};use serde_json::Result;// 实现了 序列号和返序列化的 trait#[derive(Serialize, Deserialize)]struct Address { street: String, city: String,}fn print_an_address() -> Result<()> { let address = Address { street: "10 Downing Street".to_owned(), city: "London".to_owned(), }; // 将 struct 序列号成字符串 let j = serde_json::to_string(&address)?; // Print, write to a file, or send to an HTTP server. println!("{}", j); Ok(())}
然后我们看一下如何通过 from_str 实现反序列化。
use serde::{Deserialize, Serialize};use serde_json::Result;#[derive(Serialize, Deserialize)]struct Person { name: String, age: u8, phones: Vec<String>,}fn typed_example() -> Result<()> { // 第一个多行的字符串 let data = r#" { "name": "John Doe", "age": 43, "phones": [ "+44 1234567", "+44 2345678" ] }"#; // 字符串转工具 let p: Person = serde_json::from_str(data)?; println!("Please call {} at the number {}", p.name, p.phones[0]); Ok(())}
serde 还支持从IO reader 里面解析json,如下:

let file = fs::File::open("text.json") .expect("file should open read only");let json: serde_json::Value = serde_json::from_reader(file)
对应的可以通过 to_writer 将json 写入文件。
如果一个struct 里面默写字段不想序列化,可以添加skip 表明跳过序列化。
#[serde(skip)]