当前位置: 首页 > news >正文

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专题

配置文件 常见的配置文件有很多&#xff1a;JSON, Ini, XML, TOML, YAML … 目标&#xff1a; JSON/YAML/TOMLIniXML Rust中序列化用的最多的是 serde, 依赖它&#xff0c;有很多出色的第三方库可以使用。 其中&#xff0c;serde本身支持JSON/YAML/TOML/JSON5…多种&#…...

5.Hexo为页面标记标签和类别

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

·13·1dawwd

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…...

Docker - PostgreSQL

博文目录 文章目录 说明命令 说明 Docker Hub PostgreSQL 数据卷数据卷印射在容器内的路径postgres/var/lib/postgresql/data |容器内的路径|说明| |–|–|–| |/var/lib/postgresql/data|数据目录| 部分环境变量是否必要说明POSTGRES_PASSWORD必需设置超级用户密码POSTGRES…...

Python | Leetcode Python题解之第26题删除有序数组中的重复项

题目&#xff1a; 题解&#xff1a; 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医疗”的可行方案如下&#xff1a; 一、方案目标 利用AI技术&#xff0c;结合医疗数据&#xff0c;开发一套高效、准确的医疗辅助系统&#xff0c;旨在提高医疗诊断的精度、加速药物研发进程、优化疾病预测模型&#xff0c;从而辅助医生进行疾病诊断和治疗方案制定。…...

时序预测 | Matlab实现SSA-ESN基于麻雀搜索算法(SSA)优化回声状态网络(ESN)的时间序列预测

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

Go——面向对象

一. 匿名字段 go支持只提供类型而不写字段名的方式&#xff0c;也就是匿名字段&#xff0c;也称为嵌入字段。 同名字段的情况 所以自定义类型和内置类型都可以作为匿名字段使用 指针类型匿名字段 二.接口 接口定义了一个对象的行为规范&#xff0c;但是定义规范不实现&#xff…...

身份证识别ocr、身份证实名认证接口文档

每一次验证背后&#xff0c;都是对用户数据安全的承诺&#xff0c;对平台信誉的坚守。翔云身份证实名认证API&#xff0c;通过身份证识别接口仅需一键上传身份证图片即可快速识别身份证信息&#xff0c;翔云实名认证接口实时联网查验证件信息的真伪。 ​PHP身份证实名认证接口…...

C++ 文件操作

C中对文件操作需要包含头文件 < fstream > 文件类型分为两种&#xff1a; 1 . 文本文件 - 文件以文本的**ASCII码**形式存储在计算机中 2 . 二进制文件 - 文件以文本的**二进制**形式存储在计算机中&#xff0c;用户一般不能直接读懂它们 操作文件的三大类: 1 . ofstream…...

【数据结构】-- 单链表 vs 双向链表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;python从入门到精通&#xff0c;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文…...

暴雨孙辉:做好服务器,但更要辟出技术落地之道

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

天地人和•大道不孤——卢禹舜中国画作品展在重庆美术馆隆重开幕

2024年4月12日&#xff0c;由中国国家画院、重庆市文化和旅游发展委员会主办&#xff0c;重庆美术馆&#xff08;重庆画院、重庆国画院&#xff09;、北京八荒锦绣美术馆、中国国际文化交流基金会卢禹舜艺术基金承办的“天地人和•大道不孤——卢禹舜中国画作品展”开幕式在重庆…...

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’ 以下是解决方案&#xff1a; 1.更新编译器 sudo apt-get install gcc-arm-linux-gnueabi 更新后修改Makefile 中编译器路径如下图 2.你以为更新完就可…...

(学习日记)2024.04.16:UCOSIII第四十四节:内存管理

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…...

微信小程序Skyline模式下瀑布长列表优化成虚拟列表,解决内存问题

微信小程序长列表&#xff0c;渲染的越多就会导致内存吃的越多。特别是长列表的图片组件和广告组件。 为了解决内存问题&#xff0c;所以看了很多人的资料&#xff0c;都不太符合通用的解决方式&#xff0c;很多需要固定子组件高度&#xff0c;但是瀑布流是无法固定的&#xf…...

大语言模型LLM《提示词工程指南》学习笔记03

文章目录 大语言模型LLM《提示词工程指南》学习笔记03链式提示思维树检索增强生成自动推理并使用工具自动提示工程师Active-Prompt方向性刺激提示Program-Aided Language ModelsReAct框架Reflexion多模态思维链提示方法基于图的提示大语言模型LLM《提示词工程指南》学习笔记03 …...

239. 奇偶游戏(带权值并查集,邻域并查集,《算法竞赛进阶指南》)

239. 奇偶游戏 - AcWing题库 小 A 和小 B 在玩一个游戏。 首先&#xff0c;小 A 写了一个由 0 和 1 组成的序列 S&#xff0c;长度为 N。 然后&#xff0c;小 B 向小 A 提出了 M 个问题。 在每个问题中&#xff0c;小 B 指定两个数 l 和 r&#xff0c;小 A 回答 S[l∼r] 中…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...