52 lines
1.6 KiB
Rust
52 lines
1.6 KiB
Rust
use serde::{Serialize, Deserialize};
|
|
use serde_json::Number;
|
|
use serde_json::map::Map;
|
|
use serde_json::Value as JsonValue;
|
|
use serde_hjson::Value as HJsonValue;
|
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
|
struct Config {
|
|
id: f64,
|
|
name: String,
|
|
}
|
|
|
|
fn main() {
|
|
let confing_str = r#"
|
|
{
|
|
id: 111 // id
|
|
name: "hatter jiang" // name
|
|
}
|
|
"#;
|
|
// let c: Config = serde_hjson::from_str(confing_str).unwrap(); // why not works?
|
|
let c: HJsonValue = serde_hjson::from_str(confing_str).unwrap();
|
|
println!("{:#?}", &c);
|
|
println!("{}", serde_json::to_string_pretty(&map(&c)).unwrap());
|
|
let cc: Config = serde_json::from_str(&serde_json::to_string_pretty(&map(&c)).unwrap()).unwrap();
|
|
println!("{}", serde_json::to_string_pretty(&cc).unwrap());
|
|
}
|
|
|
|
fn map(c: &HJsonValue) -> JsonValue {
|
|
match c {
|
|
HJsonValue::Array(a) => {
|
|
let mut aa = vec![];
|
|
for x in a.iter() {
|
|
aa.push(map(x));
|
|
}
|
|
JsonValue::Array(aa)
|
|
}
|
|
HJsonValue::Bool(b) => JsonValue::Bool(*b),
|
|
HJsonValue::F64(f) => JsonValue::Number(Number::from_f64(*f).unwrap()),
|
|
HJsonValue::I64(i) => JsonValue::Number(Number::from_f64(*i as f64).unwrap()),
|
|
HJsonValue::Null => JsonValue::Null,
|
|
HJsonValue::Object(o) => {
|
|
let mut mm = Map::new();
|
|
for (k, v) in o.iter() {
|
|
mm.insert(k.to_owned(), map(v));
|
|
}
|
|
JsonValue::Object(mm)
|
|
},
|
|
HJsonValue::String(s) => JsonValue::String(s.to_owned()),
|
|
HJsonValue::U64(u) => JsonValue::Number(Number::from_f64(*u as f64).unwrap()),
|
|
}
|
|
}
|