#serde-json #variant #reduce-boilerplate #properties #nested #trying #macro

json_extract

此宏在尝试获取嵌套属性时使用 serde_json::Value 变体以减少样板代码

1 个不稳定版本

0.1.4 2022年3月24日
0.1.3 2022年3月24日
0.1.2 2022年3月23日
0.1.1 2022年3月23日
0.1.0 2022年3月23日

#1437 in 编码

MIT 许可证

9KB
57

json-extract-macro

用1行代码访问嵌套JSON值

此宏在尝试获取嵌套属性时使用 serde_json::Value 变体以减少样板代码。

let json_parsed = serde_json::json!({
   "brand": {
      "tesla": {
         "model": {
             "designers": "Mr Bean"
            }
         }
     }
 });

let designer: Option<String> = json_extract!("brand.tesla.model.designer", &json_parsed, String);

println!("Who tf is this designer? {}",designer.unwrap_or_default());

或...

 if let serde_json::Value::Object(brand) = &json_parsed {
     let brand = brand.get("brand").unwrap();
     if let serde_json::Value::Object(tesla) = &brand {
         let tesla = tesla.get("tesla").unwrap();
         if let serde_json::Value::Object(model) = &tesla {
             let model = model.get("model").unwrap();
             if let serde_json::Value::Object(designers) = &model {
                 let res = designer.get("designer");
                 let designer = serde_json::from_value::<String>(res.unwrap().to_owned()).unwrap();
             }
         }
     }
 }

println!("Who tf is this designer? {}",designer.unwrap_or_default());

宏参数

该宏接受3个参数

  1. 包含路径的 &str,路径由 "." 分隔
  2. 要读取的 serde_json::Value 变量。
  3. 我们想要获取的属性的类型。

支持的类型

json_serde::Value 有以下变体

  • 数组
  • 布尔值
  • 空值
  • 数字
  • 对象
  • 字符串

宏的第三个参数是 Rust 类型,因此,如果我们想从某些变体获取数据,可以传递以下内容

值变体 Rust 类型
数组 Vec<字符串>, Vec<bool>, Vec<f64>, Vec<Value> ...
布尔值 bool
数字 u32, i32, i64, f32, usize ...
对象 Value
字符串 字符串
空值 不支持

依赖项

~0.7–1.6MB
~35K SLoC