在 Rust 中使用 Serde 处理json
在本文中,我们将讨论 Serde、如何在 Rust 应用程序中使用它以及一些更高级的提示和技巧。
什么是serde?
Rust中的serde
crate用于高效地序列化和反序列化多种格式的数据。它通过提供两个可以使用的traits来实现这一点,这两个traits为 Deserialize
和 Serialize
。作为生态系统中最著名的 crate 之一,它目前支持 20 多种类型的序列化(反序列化)。
首先,您需要将 crate 安装到您的 Rust 应用程序中:
cargo add serde
使用serde
Deserializing and Serializing 数据
序列化和反序列化数据的简单方法是添加 serde derive
功能。这会添加一个宏,您可以使用它来自动实现 Deserialize
和 Serialize
traits - 您可以使用 --features
标志(短的 -F
来实现):
cargo add serde -F derive
然后我们可以将宏添加到我们想要实现 Deserialize
或 Serialize
的任何结构体或枚举中:
use serde::{
Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct MyStruct {
message: String,
// ... the rest of your fields
}
这允许我们使用任何支持 serde
的crate 在所述格式之间进行转换。作为示例,让我们使用 serde-json
与 JSON 格式相互转换:
use serde_json::json;
use serde::{
Deserialize, Serialize};
#[derive(Deserialize, Serialize)]
struct MyStruct {
message: String,
}
fn to_and_from_json() {
let json = json!({
"message": "Hello world!"});
let my_struct: MyStruct = serde_json::from_str(&json).unwrap();
assert_eq!(my_struct, MyStruct {
message: "Hello world!".to_string());
assert!(serde_json::to_string(my_struct).is_ok());
}
如果您有兴趣在 Rust 应用程序中使用 serde-json
,我们有一篇讨论 JSON 解析库的文章,您可以在此处查看。
我们还可以对许多源进行反序列化和序列化,包括文件流 I/O、JSON 字节数组等。
自定义实现反序列化和序列化
为了更好地理解 serde
在底层是如何工作的,我们还可以自定义实现 Deserialize
和 Serialize
。这相当复杂,但现在我们将实现一个简单的。下面是序列化 i32
基元类型的简单实现:
use serde::{
Serializer, Serialize};
impl Serialize for i32 {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>