Rust 新建项目,解析json
【摘要】 一、 新建项目使用 cargo new <项目名称> 命令新建项目,得到如下目录结构 二、 添加依赖库cd <项目名> 进入项目目录,然后使用 cargo add serde-json 命令添加依赖库 三、反序列化(字符串转json)这段 Rust 代码演示了如何使用 serde_json 库来解析 JSON 字符串并访问其中的数据。下面是对代码的逐步解释: 1. 导入依赖use serd...
一、 新建项目
使用 cargo new <项目名称>
命令新建项目,得到如下目录结构
二、 添加依赖库
cd <项目名>
进入项目目录,然后使用 cargo add serde-json
命令添加依赖库
三、反序列化(字符串转json)
这段 Rust 代码演示了如何使用 serde_json
库来解析 JSON 字符串并访问其中的数据。下面是对代码的逐步解释:
1. 导入依赖
use serde_json::{Result, Value, from_str};
- 从
serde_json
库中导入三个关键组件:Result
: 用于处理可能的解析错误(实际上是serde_json::Result
类型,等同于Result<Value, serde_json::Error>
)Value
: 表示可以表示任何 JSON 值的枚举类型from_str
: 一个将 JSON 字符串解析为Value
的函数
2. 主函数
fn main() -> Result<()>{
- 定义主函数,返回类型为
Result<()>
,表示可能返回serde_json::Error
或成功返回()
(空元组)
3. JSON 字符串
let data = r#"
{
"code": 200,
"msg": "插入成功",
"data": {
"name": "bob",
"age": 35,
"isMale": true
}
}
"#;
- 定义一个原始字符串(使用
r#""#
语法允许包含未转义的引号和换行) - 这个 JSON 对象包含:
code
: 数字 200msg
: 字符串 “插入成功”data
: 嵌套对象,包含 name、age 和 isMale 字段
4. 打印原始 JSON
println!("data: {}", data);
- 打印原始的 JSON 字符串
5. 解析 JSON
let v: Value = from_str(data)?;
- 使用
from_str
函数将 JSON 字符串解析为Value
类型 ?
操作符用于错误处理:如果解析失败,会提前返回错误
6. 访问解析后的数据
println!("code: {}, msg: {}, data: {}", v["code"], v["msg"], v["data"]);
- 打印解析后的 JSON 数据:
v["code"]
访问 code 字段(数字)v["msg"]
访问 msg 字段(字符串)v["data"]
访问 data 对象(会打印为 JSON 字符串)
7. 返回成功
Ok(())
}
- 表示程序成功执行,返回
Ok(())
8. 补充说明
Value
类型是serde_json
提供的枚举,可以表示任何 JSON 值(对象、数组、字符串、数字、布尔值等)- 当访问不存在的字段时,程序会 panic(因为使用了
[]
索引) - 更安全的访问方式是使用
get()
方法,它会返回Option<&Value>
完整代码为
use serde_json::{Result, Value, from_str};
fn main() -> Result<()>{
let data = r#"
{
"code": 200,
"msg": "插入成功",
"data": {
"name": "bob",
"age": 35,
"isMale": true
}
}
"#;
println!("data: {}", data);
let v: Value = from_str(data)?;
println!("code: {}, msg: {}, data: {}", v["code"], v["msg"], v["data"]);
Ok(())
}
执行结果如下
三、序列化(对象转字符串)
use serde_json::{Result, Value, from_str, json};
fn main() -> Result<()>{
let obj = json!({
"name": "Donald John Trump",
"age": 78,
"phone": [
"+86 13700000001",
"+86 18700000002"
]
});
println!("first phone number: {}", obj["phone"][0]);
println!("{}", obj.to_string());
Ok(())
}
json!是一个宏定义,所有以!结尾的函数都是宏定义函数,该函数的作用是将map对象转为json对象
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)