概括多个目标结构的一种方法可能是使用
serde
对于自定义格式,必须实现反序列化程序,
但不是这样的实施
您的格式似乎是
TOML
格式:如果是这种情况,请使用
toml
.
#[macro_use]
extern crate serde_derive;
#[derive(Serialize, Deserialize, Debug)]
struct Data {
field1: Option<String>,
field2: Option<u32>,
field3: Option<bool>,
field4: Option<std::net::Ipv4Addr>
}
fn main() {
let serialized = r#"
field1="something"
field2=556
field3=true
field4="10.0.0.1"
"#;
let deserialized: Data = toml::from_str(&serialized).unwrap();
println!("{:?}", deserialized);
}
如果您的格式与“标准”不完全兼容,请在反序列化之前寻找转换编码数据的方法:例如,如果
field1
field4
regex
#[macro_use]
extern crate serde_derive;
use std::borrow::Cow;
use regex::{Captures, Regex};
#[derive(Serialize, Deserialize, Debug)]
struct Data {
field1: Option<String>,
field2: Option<u32>,
field3: Option<bool>,
field4: Option<std::net::Ipv4Addr>,
}
fn reformat_string(before: &str) -> Cow<str> {
let matcher : Regex = Regex::new(
r"(?P<f>field1|field4)=(?P<val>[\w.]+)"
).unwrap();
matcher.replace_all(before, |cap: &Captures| {
let mut buff = String::new();
if &cap[1] == "field1" || &cap[1] == "field4" {
cap.expand("$f='$val'", &mut buff);
}
Cow::Owned(buff)
})
}
fn main() {
let serialized = r#"
field1=something
field2=556
field3=true
field4=10.0.0.1
"#;
let transformed = reformat_string(serialized);
let deserialized: Data = toml::from_str(&transformed).unwrap();
println!("{:?}", deserialized);
}