序列化/反序列化
程序员文章站
2022-06-01 09:13:54
...
Golang在标准库内置了 包用来实现JSON编码/解码功能。我们可以定义可以轻松读取和写入JSON的类型。下面一个例子:
{
"id": 3137,
"author": {
"id": 420,
"name": "Chongchong"
},
"body": "Hello,This is Chongchong web!",
"in_reply_to": 3135
}
在Golang中,可以生成如下的结构体:
type Author struct {
ID int `json:"id"`
Name string `json:"name"`
}
type Comment struct {
ID int `json:"id"`
Author Author `json:"author"`
Body string `json:"body"`
InReplyTo int `json:"in_reply_to"`
}
Rust没有开箱即用的功能,需要使用第三方板条箱,最常用的一个库是serde,可以跨JSON和能想到的所有其他序列化方法使用。
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"
注意,上面serde的依赖配置,和其他包有差异。
Golang的JSON包通过使用struct标签作为元数据来工作,但是Rust没有,需要改用Rust的衍生功能。
因此,要将serde用于的注释类型:
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Author {
pub id: i32,
pub name: String,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Comment {
pub id: i32,
pub author: Author,
pub body: String,
pub in_reply_to: i32,
}
然后,使用以下代码解析Json:
fn main() {
let data = r#"
{
"id": 3137,
"author": {
"id": 420,
"name": "Chongchong"
},
"body": "Hello,This is Chongchong web!",
"in_reply_to": 3135
}
"#;
let c: Comment = serde_json::from_str(data).expect("json to parse");
println!("comment: {:#?}", c);
}
cargo run
...
Finished dev [unoptimized + debuginfo] target(s) in 0.04s
Running `target/debug/serdeex`
comment: Comment {
id: 3137,
author: Author {
id: 420,
name: "Chongchong",
},
body: "Hello,This is Chongchong web!",
in_reply_to: 3135,
}
上一篇: Java序列化与反序列化