怎么用模板做网站,开封网站seo,asp网站部署,wordpress 网站费用配置文件
常见的配置文件有很多#xff1a;JSON, Ini, XML, TOML, YAML …
目标#xff1a;
JSON/YAML/TOMLIniXML
Rust中序列化用的最多的是 serde, 依赖它#xff0c;有很多出色的第三方库可以使用。
其中#xff0c;serde本身支持JSON/YAML/TOML/JSON5…多种#…配置文件
常见的配置文件有很多JSON, Ini, XML, TOML, YAML …
目标
JSON/YAML/TOMLIniXML
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: VecString,
}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: VecTranslation,
}const XML: str r#
?xml version1.0 encodingutf-8?
ConfigDefaultSettings Languagees GreetingHELLO/LocalizationTranslation TagHELLO Languagejaこんにちは/TranslationTranslation TagBYE Languagejaさようなら/TranslationTranslation TagHELLO LanguageesHola/TranslationTranslation TagBYE LanguageesAdiós/Translation/Localization
/Config
#;const XML2: str r#Translation TagHELLO Languagejaこんにちは/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_s1123
config s2abc,xyz
[app]
ip192.168.1.2
testt_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:ConfigDefaultSettings Languagees Greetinggood good study/LocalizationTranslation TagHELLO Languagejaこんにちは/TranslationTranslation TagBYE Languagejaさようなら/TranslationTranslation TagHELLO LanguageesHola/TranslationTranslation TagBYE LanguageesAdiós/Translation/Localization/Config