3个版本
0.0.3 | 2020年4月11日 |
---|---|
0.0.2 | 2020年4月11日 |
0.0.1 | 2020年4月10日 |
#2911 in 解析器实现
34KB
756 行
Jst
该包包含
- JSON数据结构
- JSON解析器
- JSON转字符串
- 宏:以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
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"]
待办事项
- 改进解析器测试
- 改进索引器(可以通过索引设置值)
- 添加错误代码
- 序列化和反序列化
- 用于解构对象和数组的宏
- 添加 json-schema 验证器
- 支持 yml 格式
- 对象和数组使用共享指针的选项
- 考虑使用 indexmap crate 代替 HeadMap(以保持插入顺序)
许可证
MIT
依赖项
~475KB