Rust 实战练习 - 10. JSON、XML、YAML/TOML、Ini专题
配置文件
常见的配置文件有很多:JSON, Ini, XML, TOML, YAML …
目标:
- JSON/YAML/TOML
- Ini
- XML
Rust中序列化用的最多的是 serde
, 依赖它,有很多出色的第三方库可以使用。
其中,serde
本身支持JSON/YAML/TOML/JSON5…多种,这里使用serde_json
.
XML需要第三方库quick-xml
,他通过支持serde
也支持了结构体序列化,配合十分完美.
INI比较特别,这里有一个比较强大的库,支持带注释的ini, configparser
.
依赖文件:
[dependencies]
configparser = "*" # ini支持
serde = { version = "*", features = ["derive"] } # 后续的库的基础
serde_json = "*" # JSON支持
quick-xml = { version = "*",features=["serde","serialize"] } # xml 支持
Code
use configparser::ini::Ini;
use serde_json::{json, Value};
use serde::{Deserialize, Serialize};
use quick_xml;fn main() {println!("\r\n1. Ini config");ini_call();println!("\r\n2. Json config");// serde库 支持 json, toml, yaml ... 多种格式,方法也类似json_call();println!("\r\n3. XML config");// 支持 xml encoding 设定xml_call();
}fn ini_call() {let ini_str = r#"default_s1 = 123 ; default sectionconfig s2 : abc,xyz # : also can be accept# comments
[ app ]
port # default value is also okip = "192.168.1.2" "#;let mut conf = Ini::new();// 解析 ini 内容if let Ok(cfg) = conf.read(ini_str.to_string()) {for (k, v) in cfg {println!("ini section: {} = {:?}", k, v);}println!("{:?}, {:?}", conf.getint("default", "default_s1"), conf.get("app", "ip"));// 修改 iniconf.set("app", "test", Some("t_val".to_string()));// output iniprintln!("\r\nini output:\r\n{}", conf.writes());}
}#[derive(Serialize, Deserialize, Debug)]
struct Person {name: String,age: u8,phones: Vec<String>,
}fn json_call() {let s1 = r#"{"name": "John Doe","age": 43,"phones": ["+44 1234567","+44 2345678"]}"#;// 解析 json// map 方式访问,支持数组if let Ok(mut v) = serde_json::from_str::<Value>(s1) {println!("{:?} {}", v.get("name"), v["phones"][0]);// 修改 Jsonv["test"]=serde_json::value::Value::String("xxxx".to_string());println!("value change: {}", v.to_string());}// 结构体映射if let Ok(mut p) = serde_json::from_str::<Person>(s1) {println!("{:?}", p);// 修改 Jsonp.phones.push("1008611".to_string());println!("after: {}", serde_json::to_string_pretty(&p).unwrap());}// macro json Valuelet v1 = json!({"name": "zhangsan","age": 33,"phones": ["1", "2"]});println!("value macro: {}", v1.to_string());
}#[derive(Debug, PartialEq, Default, Serialize,Deserialize)]
#[serde(default)]
struct Translation {#[serde(rename = "@Tag")] // @属性tag: String,#[serde(rename = "@Language")]lang: String,#[serde(rename = "$text")] // $内容text: String,
}#[derive(Debug, PartialEq, Default, Serialize,Deserialize)]
#[serde(default)]
struct DefaultSettings {#[serde(rename = "@Language")]language: String,#[serde(rename = "@Greeting")]greeting: String,
}#[derive(Debug, PartialEq, Default, Serialize,Deserialize)]
#[serde(default, rename_all = "PascalCase")]
struct Config {#[serde(rename = "DefaultSettings")]settings: DefaultSettings,localization: Localization,
}
#[derive(Debug, PartialEq, Default, Serialize,Deserialize)]
#[serde(rename_all = "PascalCase")]
struct Localization {translation: Vec<Translation>,
}const XML: &str = r#"
<?xml version="1.0" encoding="utf-8"?>
<Config><DefaultSettings Language="es" Greeting="HELLO"/><Localization><Translation Tag="HELLO" Language="ja">こんにちは</Translation><Translation Tag="BYE" Language="ja">さようなら</Translation><Translation Tag="HELLO" Language="es">Hola</Translation><Translation Tag="BYE" Language="es">Adiós</Translation></Localization>
</Config>
"#;const XML2: &str = r#"<Translation Tag="HELLO" Language="ja">こんにちは</Translation>
"#;
fn xml_call(){// 简单解析XMLif let Ok(t2) = quick_xml::de::from_str::<Translation>(XML2){println!("xml2 struct:\r\n\t {:?}", t2);}// 复杂的解析XMLif let Ok(mut t) = quick_xml::de::from_str::<Config>(XML){println!("xml settings: \r\n\t{:?}", t.settings);println!("xml localization: \r\n\t{:?}", t.localization);// 修改XMLt.settings.greeting = "good good study".to_string();// outprintln!("format output:\r\n\t{}",quick_xml::se::to_string(&t).unwrap());}
}
输出
1. Ini config
ini section: app = {"ip": Some("\"192.168.1.2\""), "port": None}
ini section: default = {"default_s1": Some("123"), "config s2": Some("abc,xyz")}
Ok(Some(123)), Some("\"192.168.1.2\"")ini output:
default_s1=123
config s2=abc,xyz
[app]
ip="192.168.1.2"
test=t_val
port2. Json config
Some(String("John Doe")) "+44 1234567"
value change: {"age":43,"name":"John Doe","phones":["+44 1234567","+44 2345678"],"test":"xxxx"}
Person { name: "John Doe", age: 43, phones: ["+44 1234567", "+44 2345678"] }
after: {"name": "John Doe","age": 43,"phones": ["+44 1234567","+44 2345678","1008611"]
}
value macro: {"age":33,"name":"zhangsan","phones":["1","2"]}3. XML config
xml2 struct:Translation { tag: "HELLO", lang: "ja", text: "こんにちは" }
xml settings: DefaultSettings { language: "es", greeting: "HELLO" }
xml localization: Localization { translation: [Translation { tag: "HELLO", lang: "ja", text: "こんにちは" }, Translation { tag: "BYE", lang: "ja", text: "さようなら" }, Translation { tag: "HELLO", lang: "es", text: "Hola" }, Translation { tag: "BYE", lang: "es", text: "Adiós" }] }
format output:<Config><DefaultSettings Language="es" Greeting="good good study"/><Localization><Translation Tag="HELLO" Language="ja">こんにちは</Translation><Translation Tag="BYE" Language="ja">さようなら</Translation><Translation Tag="HELLO" Language="es">Hola</Translation><Translation Tag="BYE" Language="es">Adiós</Translation></Localization></Config>
相关文章:
Rust 实战练习 - 10. JSON、XML、YAML/TOML、Ini专题
配置文件 常见的配置文件有很多:JSON, Ini, XML, TOML, YAML … 目标: JSON/YAML/TOMLIniXML Rust中序列化用的最多的是 serde, 依赖它,有很多出色的第三方库可以使用。 其中,serde本身支持JSON/YAML/TOML/JSON5…多种&#…...

5.Hexo为页面标记标签和类别
Hexo的标签和类别基本上是可以在Hexo中将内容分组的两种方式 如果在网站上有一堆内容,有不同的博客文章 将博客文章分类为不同的类别会很有帮助 用特定的关键词为博客文章标记 如果可以同时分类和标记页面,会使网站用户更轻松地找到他们想要的页面类型 …...

·13·1dawwd
c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…...
Docker - PostgreSQL
博文目录 文章目录 说明命令 说明 Docker Hub PostgreSQL 数据卷数据卷印射在容器内的路径postgres/var/lib/postgresql/data |容器内的路径|说明| |–|–|–| |/var/lib/postgresql/data|数据目录| 部分环境变量是否必要说明POSTGRES_PASSWORD必需设置超级用户密码POSTGRES…...

Python | Leetcode Python题解之第26题删除有序数组中的重复项
题目: 题解: class Solution:def removeDuplicates(self, nums: List[int]) -> int:if not nums:return 0n len(nums)fast slow 1while fast < n:if nums[fast] ! nums[fast - 1]:nums[slow] nums[fast]slow 1fast 1return slow...

【电控笔记4】拉普拉斯-传递函数-pid
数据标幺化 拉普拉斯变换 欧拉公式 常见s变换 s变换性质...
针对“AI+医疗”的可行方案
针对“AI医疗”的可行方案如下: 一、方案目标 利用AI技术,结合医疗数据,开发一套高效、准确的医疗辅助系统,旨在提高医疗诊断的精度、加速药物研发进程、优化疾病预测模型,从而辅助医生进行疾病诊断和治疗方案制定。…...

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测
时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测 目录 时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SSA-ESN基于麻雀搜索…...

Go——面向对象
一. 匿名字段 go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段。 同名字段的情况 所以自定义类型和内置类型都可以作为匿名字段使用 指针类型匿名字段 二.接口 接口定义了一个对象的行为规范,但是定义规范不实现ÿ…...
身份证识别ocr、身份证实名认证接口文档
每一次验证背后,都是对用户数据安全的承诺,对平台信誉的坚守。翔云身份证实名认证API,通过身份证识别接口仅需一键上传身份证图片即可快速识别身份证信息,翔云实名认证接口实时联网查验证件信息的真伪。 PHP身份证实名认证接口…...
C++ 文件操作
C中对文件操作需要包含头文件 < fstream > 文件类型分为两种: 1 . 文本文件 - 文件以文本的**ASCII码**形式存储在计算机中 2 . 二进制文件 - 文件以文本的**二进制**形式存储在计算机中,用户一般不能直接读懂它们 操作文件的三大类: 1 . ofstream…...

【数据结构】-- 单链表 vs 双向链表
🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…...

暴雨孙辉:做好服务器,但更要辟出技术落地之道
稳扎稳打一直是暴雨的风格,这在被访者孙辉的身上尽显。作为暴雨(武汉暴雨信息发展有限公司)中国区销售及市场副总裁,在谈及公司的技术发展与市场推广走势之时,孙辉沉稳、敏锐且逻辑清晰。 因在服务器领域起步很早&…...

天地人和•大道不孤——卢禹舜中国画作品展在重庆美术馆隆重开幕
2024年4月12日,由中国国家画院、重庆市文化和旅游发展委员会主办,重庆美术馆(重庆画院、重庆国画院)、北京八荒锦绣美术馆、中国国际文化交流基金会卢禹舜艺术基金承办的“天地人和•大道不孤——卢禹舜中国画作品展”开幕式在重庆…...
python-pytorch使用日志0.5.007
python-pytorch使用日志 1. optimizer.zero_grad()和model.zero_grad()的区别2. cbow和skip-gram的训练数据格式3. 获取cbow和skip-gram训练后的中文词向量4. 获取到词向量后可以做什么5. 余弦相似度结果的解释 1. optimizer.zero_grad()和model.zero_grad()的区别 都是清空模…...

itop4412编译内核时garbage following instruction -- `dmb ish‘ 解决方案
王德法 没人指导的学习路上磕磕绊绊太耗费时间了 今天编译4412开发板源码时报 garbage following instruction – dmb ish’ 以下是解决方案: 1.更新编译器 sudo apt-get install gcc-arm-linux-gnueabi 更新后修改Makefile 中编译器路径如下图 2.你以为更新完就可…...

(学习日记)2024.04.16:UCOSIII第四十四节:内存管理
写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…...

微信小程序Skyline模式下瀑布长列表优化成虚拟列表,解决内存问题
微信小程序长列表,渲染的越多就会导致内存吃的越多。特别是长列表的图片组件和广告组件。 为了解决内存问题,所以看了很多人的资料,都不太符合通用的解决方式,很多需要固定子组件高度,但是瀑布流是无法固定的…...
大语言模型LLM《提示词工程指南》学习笔记03
文章目录 大语言模型LLM《提示词工程指南》学习笔记03链式提示思维树检索增强生成自动推理并使用工具自动提示工程师Active-Prompt方向性刺激提示Program-Aided Language ModelsReAct框架Reflexion多模态思维链提示方法基于图的提示大语言模型LLM《提示词工程指南》学习笔记03 …...
239. 奇偶游戏(带权值并查集,邻域并查集,《算法竞赛进阶指南》)
239. 奇偶游戏 - AcWing题库 小 A 和小 B 在玩一个游戏。 首先,小 A 写了一个由 0 和 1 组成的序列 S,长度为 N。 然后,小 B 向小 A 提出了 M 个问题。 在每个问题中,小 B 指定两个数 l 和 r,小 A 回答 S[l∼r] 中…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...