- Notifications
You must be signed in to change notification settings - Fork10
Rust port of gjson,get JSON value by dotpath syntax
License
importcjj/rust-ajson
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
change name to AJSON, seeissue
Inspiration comes fromgjson in golang
Add it to yourCargo.toml
file:
[dependencies]ajson = "0.3"
- Add documentation
- Follow api-guidelines
- Update benchmark
- Optimize
AJSON get json value with specified path, such asproject.name
orproject.version
. When the path matches, it returns immediately!
let data =r#"{ "project": { "name": "ajson", "maintainer": "importcjj", "version": 0.1, "rusts": ["stable", "nightly"] }}"#;let name = ajson::get(data,"project.name").unwrap().unwrap();println!("{}", name.as_str());// ajson
JSON example
{"name": {"first":"Tom","last":"Anderson"},"age":37,"children": ["Sara","Alex","Jack"],"fav.movie":"Deer Hunter","friends": [ {"first":"Dale","last":"Murphy","age":44,"nets": ["ig","fb","tw"]}, {"first":"Roger","last":"Craig","age":68,"nets": ["fb","tw"]}, {"first":"Jane","last":"Murphy","age":47,"nets": ["ig","tw"]} ]}
Below is a quick overview of the path syntax, for more complete information please check out GJSON Syntax.
A path is a series of keys separated by a dot. A key may contain special wildcard characters '*' and '?'. To access an array value use the index as the key. To get the number of elements in an array or to access a child path, use the '#' character. The dot and wildcard characters can be escaped with ''.
name.last >> "Anderson"age >> 37children >> ["Sara","Alex","Jack"]children.# >> 3children.1 >> "Alex"child*.2 >> "Jack"c?ildren.0 >> "Sara"fav\.movie >> "Deer Hunter"friends.#.first >> ["Dale","Roger","Jane"]friends.1.last >> "Craig"
Special purpose characters, such as ., *, and ? can be escaped with .
fav\.movie "Deer Hunter"
The # character allows for digging into JSON Arrays.To get the length of an array you'll just use the # all by itself.
friends.# 3friends.#.age [44,68,47]
You can also query an array for the first match by using #(...), or find all matches with #(...)#. Queries support the ==, !=, <, <=, >, >= comparison operators and the simple pattern matching % (like) and !% (not like) operators.
friends.#(last=="Murphy").first >> "Dale"friends.#(last=="Murphy")#.first >> ["Dale","Jane"]friends.#(age>45)#.last >> ["Craig","Murphy"]friends.#(first%"D*").last >> "Murphy"friends.#(nets.#(=="fb"))#.first >> ["Dale","Roger"]
Basically, you can use selectors to assemble whatever you want, and of course, the result is still a json ;)
{name.first,age,"murphys":friends.#(last="Murphy")#.first}[name.first,age,children.0]
ajson::get(json,"name.[first,last]").unwrap().unwrap().to_vec();ajson::get(json,"name.first").unwrap().unwrap(); ajson::get(json,"name.last").unwrap().unwrap();
Value types.
enumValue{String(String),Number(Number),Object(String),Array(String),Boolean(bool),Null,}
Value has a number of methods that meet your different needs.
value.get(&str) ->Option<Value>value.as_str() ->&strvalue.as_u64() ->u64value.as_i64() -> i64value.as_f64() -> f64value.as_bool() -> boolvalue.as_vec() ->Vec<Value>value.as_object() ->HashMap<String,Value>
value.is_number() ->boolvalue.is_string() ->boolvalue.is_bool() ->boolvalue.is_object() ->boolvalue.is_array() ->boolvalue.is_null() -> bool
$ cargo bench
ajson benchmark time: [2.0816 us 2.0865 us 2.0917 us] change: [+0.6172% +0.9272% +1.2430%] (p = 0.00 < 0.05) Change within noise threshold.Found 11 outliers among 100 measurements (11.00%) 7 (7.00%) high mild 4 (4.00%) high severeserde_json benchmark time: [23.033 us 23.076 us 23.119 us] change: [-0.7185% -0.3455% +0.0230%] (p = 0.07 > 0.05) No change in performance detected.Found 7 outliers among 100 measurements (7.00%) 6 (6.00%) high mild 1 (1.00%) high severejson-rust benchmark time: [12.225 us 12.289 us 12.381 us] change: [-2.6200% -1.1789% +0.8442%] (p = 0.19 > 0.05) No change in performance detected.Found 9 outliers among 100 measurements (9.00%) 5 (5.00%) high mild 4 (4.00%) high severeajson selector time: [1.1523 us 1.1561 us 1.1604 us] change: [+0.1567% +0.7278% +1.2945%] (p = 0.01 < 0.05) Change within noise threshold.Found 3 outliers among 100 measurements (3.00%) 3 (3.00%) high mildajson multi query time: [559.19 ns 559.96 ns 560.77 ns] change: [-1.4268% -1.0380% -0.6698%] (p = 0.00 < 0.05) Change within noise threshold.Found 3 outliers among 100 measurements (3.00%) 3 (3.00%) high mildserde derive time: [4.5301 us 4.5403 us 4.5507 us] change: [-2.3423% -1.9438% -1.5697%] (p = 0.00 < 0.05) Performance has improved.Found 2 outliers among 100 measurements (2.00%) 2 (2.00%) high mildserde derive multi query time: [956.86 ns 962.64 ns 970.05 ns] change: [-1.7069% -1.0299% -0.2924%] (p = 0.01 < 0.05) Change within noise threshold.Found 9 outliers among 100 measurements (9.00%) 3 (3.00%) high mild 6 (6.00%) high severenom json bench time: [2.9468 us 2.9515 us 2.9566 us]Found 5 outliers among 100 measurements (5.00%) 4 (4.00%) high mild 1 (1.00%) high severe
- MacBook Pro (14-inch, 2021)
- Apple M1 Pro
- 16 GB
MIT License.
About
Rust port of gjson,get JSON value by dotpath syntax
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors4
Uh oh!
There was an error while loading.Please reload this page.