Files
simple-rust-tests/__serialization/hjson/src/main.rs
2020-11-29 13:37:16 +08:00

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()),
}
}