JSON作为目前流行的数据格式之一,被大家广泛使用。在日常的开发实践中,将JSON数据反序列化为对应的类型具有以下几个重要的意义:
1. 访问和操作数据
将JSON数据反序列化为对应的类型,可以更方便地访问和操作数据,而无需手动解析JSON字符串。
2. 类型检查和验证
在反序列化过程中,会将JSON数据映射到指定的类型,如果JSON数据与类型不匹配,将会抛出异常或返回错误。这样可以确保数据的完整性和一致性。
3.可读性和可维护性
使用类型化的数据结构可以更好地表达数据的含义,使代码更易于理解和维护。
在Rust中,Serde几乎成了JSON数据解析的事实标准,例如tokio、Actix等网络库都采用Serde来处理JSON的序列化和反序列工作。Serde简化数据序列化和反序列化的过程,提供类型安全和错误处理,支持自定义序列化和反序列化逻辑,它的强大功能使它得到了广泛的应用和支持。
安装依赖
cargo add serde
cargo add serde_json
注意,安装完成后,需要修改Cargo.toml,如下:
[dependencies]
serde = {version="1.0.194",features=["derive"]}
serde_json = "1.0.110"
thiserror = "1.0.56"
给serde加上features=["derive"]
定义json文件
{
"projectName": "测试工程",
"projectBase": {
"comment": "项目的基础功能模板配置",
"git": "模版的git地址",
"tag": "版本号或者分支名称,版本号参考semver规则"
},
"pages": {
...
},
"components": {
...
},
"composeAreas":{
...
}
}
定义对应类型
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CliConfig {
pub project_name: String,
pub project_base: ProjectBase,
pub components: Components,
pub compose_areas: ComposeAreas,
}
注意rename_all="camelCase"
的使用,将json数据中的projectName
转换成project_name
。
最后从文件加载并进行反序列化。
use crate::errors::MyResult;
use crate::models::CliConfig;
use std::fs::File;
use std::io::BufReader;
pub struct Data {}
impl Data {
pub fn load_config(config_path: &str) -> MyResult<CliConfig> {
let file = File::open(config_path)?;
let reader = BufReader::new(file);
let config: CliConfig = serde_json::from_reader(reader)?;
Ok(config)
}
}
上面的代码可以完成日常的json反序列化工作。
更高级的使用,请参考官方文档:https://serde.rs/,其中的https://serde.rs/examples.html部分写得非常详细。我这里列出几个稍微常用一点的。
以上的代码来至于我的uni-platform的开源项目
这篇文章收录我的Rust 实战专栏。请关注我,不要错过更新哟。