3个版本

0.0.3 2020年4月11日
0.0.2 2020年4月11日
0.0.1 2020年4月10日

#2911 in 解析器实现

MIT 许可证

34KB
756

Jst

该包包含

  1. JSON数据结构
  2. JSON解析器
  3. JSON转字符串
  4. 宏:以JavaScript对象方式编写JSON

转换器和宏

该包支持 obj!、val! 和 arr! 宏,以更简便的方式编写任何JSON对象(类似于JavaScript对象语法并得到自动补全错误)。

JSON宏

    // basic usage

    let dog = obj! {
      color: "brown",
      type: "Akbash",
      eating : [
        "WholeHearted",
        "Royal Canin"
      ]
    };

    // advance usage

    let key = "var_key";
    let age = 45;
    let like_banana = true;

    let person = obj! {
        name: "jhon",
        // use value name as a key
        age,
        like_banana,
        like_rust: true,
        like_go: null,
        emails : [
            "[email protected]",
            "[email protected]"
        ],
        // you can flat obj into - the dog is copy not moved
        ...dog
        address: {
            city: "somewhere",
            zip: 5612
        },
        "literal": true,
        [key]: "var_key",
        age: 56
    };

值宏

从任何有效的JSON格式创建 json::Val 枚举


let str = val!("some string");
let num = val!(45);
let bool = val!(true);
let null = val!(null);
let array = val!(["string", 45]);

let json = val!({
  key:"string",
  num:45
});

数组宏

创建一个 Vec 向量。

// the type is Vec<Val>
let arr = arr![
  "string",
  45,
  true,
  [],
  {key: "value"}
];


// Extend the arr2 by ...arr
let arr2 = arr![
  ...arr,
  "val"
];

转换器

从任何数值、String、&str、布尔值和 HashMap 形成的对象中,你可以调用 'into()' 方法将值转换为 Obj::Val 枚举

let str:Val = "some string".into();
let num:Val = 78.into();
let bool:Val = true.into();
let array:Val = vec!["string".into(), 45.into()];

// the short way is to use macros (obj!, val! and arr!)

let str = val!("some string");
let num = val!(54);
let bool = val!(true);
let null = val!(null);
let array_val = val!(["string", 45]);
// the type is Vec<Val>
let array = arr!["string", 45];

let obj_val = val!({
  key:"string",
  num:45
});
// the type is Object
let obj = obj!{
  key:"string",
  num:45
};


解析器

从字符串解析JSON

use json::{Val, Json};

fn main() {

  let mut j = Obj::new();

  let from_string = Obj::from(
    r#"{
      "number": 56,
      "string": "some string\" string",
      "boolean_true": true,
      "boolean_false": false,
      "null": null,
      "obj": {
        "key1": 456
      },
      "empty_obj": {},
      "empty_obj_new_line": {

      },
      "nested_obj" : {
        "nested1": {
          "nested2": {
            "key1": "some value",
            "key2": "anther value"
          }
        }
      },
      "array": [4564, "some string", {"bla":90, "blo": "sfsf"}, null, true, false, [], [4,5]],
      "key": 2
    }
  "#,
  );


  // Print either json or err
  if let Ok(Val::Obj(v)) = from_string {
    println!("{:?}", v);
  } else if let Err(e) = from_string {
    println!("{:?}", e)
  }
}
let val = Val::from("[3, 5, null]");

if let Ok(v) = val) {
  assert_eq!(v, Val::Array(vec![Val::Num(3.0), Val::Num(5.0), Val::Null])) // true
}

贡献

欢迎任何捐赠,开放问题、PR和新功能请求。

限制

当在 obj! 宏中使用大对象时,需要配置 #![recursion_limit = "512"]

待办事项

  1. 改进解析器测试
  2. 改进索引器(可以通过索引设置值)
  3. 添加错误代码
  4. 序列化和反序列化
  5. 用于解构对象和数组的宏
  6. 添加 json-schema 验证器
  7. 支持 yml 格式
  8. 对象和数组使用共享指针的选项
  9. 考虑使用 indexmap crate 代替 HeadMap(以保持插入顺序)

许可证

MIT

依赖项

~475KB