欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

序列化/反序列化

程序员文章站 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,
}

 

序列化/反序列化