2019-03-06 23:50:10 +09:00
# jsonpath-lib
2018-12-26 14:45:31 +09:00
2019-03-06 23:50:10 +09:00
[](https://travis-ci.org/freestrings/jsonpath)
2019-03-11 17:35:15 +09:00

2019-03-26 17:41:48 +09:00

2019-03-06 23:50:10 +09:00
2019-03-26 17:59:42 +09:00
`Rust` 버전 [JsonPath ](https://goessner.net/articles/JsonPath/ ) 구현이다. `Webassembly` 와 `Javascript` 에서도 역시 동일한 API 인터페이스를 제공 한다.
2019-03-06 23:50:10 +09:00
2019-03-26 17:59:42 +09:00
It is an implementation for [JsonPath ](https://goessner.net/articles/JsonPath/ ) written in `Rust` . it provide the same API interface in `Webassembly` and` Javascript` also.
2018-12-26 14:45:31 +09:00
2019-03-23 11:51:35 +09:00
- [Webassembly Demo ](https://freestrings.github.io/jsonpath/ )
- [Rust documentation ](https://docs.rs/jsonpath_lib/0.1.6/jsonpath_lib )
2019-03-17 18:27:47 +09:00
2018-12-26 14:45:31 +09:00
## 왜?
2019-03-06 23:50:10 +09:00
To enjoy Rust!
## 목차
2019-03-17 18:25:00 +09:00
[With Javascript ](#with-javascript )
2019-03-06 23:50:10 +09:00
- [jsonpath-wasm library ](#jsonpath-wasm-library )
2019-03-17 18:25:00 +09:00
- [jsonpath-rs library ](#jsonpath-rs-library-only-nodejs )
2019-03-11 17:35:15 +09:00
- [javascript - jsonpath.select(json: string|object, jsonpath: string) ](#javascript---jsonpathselectjson-stringobject-jsonpath-string )
2019-03-06 23:50:10 +09:00
- [javascript - jsonpath.compile(jsonpath: string) ](#javascript---jsonpathcompilejsonpath-string )
2019-03-11 17:35:15 +09:00
- [javascript - jsonpath.selector(json: string|object) ](#javascript---jsonpathselectorjson-stringobject )
- [javascript - alloc_json, dealloc_json ](#javascript---alloc_json-dealloc_json )
2019-03-17 18:25:00 +09:00
- [javascript-wasm - examples ](https://github.com/freestrings/jsonpath/wiki/javascript-wasm-examples )
2019-03-06 23:50:10 +09:00
[With Rust (as library) ](#with-rust-as-library )
- [jsonpath_lib library ](#jsonpath_lib-library )
2019-03-17 18:25:00 +09:00
- [rust - jsonpath::select(json: &serde_json::value::Value, jsonpath: &str) ](#rust---jsonpathselectjson-serde_jsonvaluevalue-jsonpath-str )
2019-03-24 21:18:58 +09:00
- [rust - jsonpath::select_as_str(json_str: &str, jsonpath: &str) ](#rust---jsonpathselect_as_strjson-str-jsonpath-str )
- [rust - jsonpath::select_as\<T\>(json_str: &str, jsonpath: &str) ](#rust---jsonpathselect_astjson-str-jsonpath-str )
2019-03-06 23:50:10 +09:00
- [rust - jsonpath::compile(jsonpath: &str) ](#rust---jsonpathcompilejsonpath-str )
2019-03-17 18:25:00 +09:00
- [rust - jsonpath::selector(json: &serde_json::value::Value) ](#rust---jsonpathselectorjson-serde_jsonvaluevalue )
- [rust - examples ](https://github.com/freestrings/jsonpath/wiki/rust-examples )
2019-03-06 23:50:10 +09:00
2019-03-17 18:25:00 +09:00
[With AWS API Gateway ](# )
2019-03-06 23:50:10 +09:00
2019-03-17 18:25:00 +09:00
[Simple time check - webassembly ](https://github.com/freestrings/jsonpath/wiki/Simple-timecheck---jsonpath-wasm )
2019-03-18 10:59:08 +09:00
2019-03-17 18:25:00 +09:00
[Simple time check - native addon for NodeJs ](https://github.com/freestrings/jsonpath/wiki/Simple-timecheck-jsonpath-native )
2018-12-26 14:45:31 +09:00
2019-03-17 18:25:00 +09:00
## With Javascript
2018-12-26 14:45:31 +09:00
2019-03-06 23:50:10 +09:00
### jsonpath-wasm library
2019-03-04 23:29:09 +09:00
2019-03-05 18:43:58 +09:00
*(not yet published `jsonpath-wasm` )*
2019-03-04 23:29:09 +09:00
```javascript
2019-03-06 18:55:21 +09:00
// browser
2019-03-04 23:29:09 +09:00
import * as jsonpath from "jsonpath-wasm";
2019-03-17 18:25:00 +09:00
// NodeJs
const jsonpath = require('jsonpath-wasm');
```
### jsonpath-rs library (Only NodeJS)
`jsonpath-rs` is native addon for NodeJs
*(not yet published `jsonpath-rs` )*
```javascript
const jsonpath = require('jsonpath-rs');
2019-03-05 14:33:33 +09:00
```
2019-03-11 17:35:15 +09:00
### javascript - jsonpath.select(json: string|object, jsonpath: string)
2019-03-05 14:33:33 +09:00
2019-03-06 18:55:21 +09:00
```javascript
let jsonObj = {
"school": {
"friends": [{"id": 0}, {"id": 1}]
},
"friends": [{"id": 0}, {"id": 1}]
};
let ret = [{"id": 0}, {"id": 0}];
2019-03-05 14:33:33 +09:00
2019-03-11 17:35:15 +09:00
let a = jsonpath.select(JSON.stringify(jsonObj), "$..friends[0]");
let b = jsonpath.select(jsonObj, "$..friends[0]");
2019-03-06 18:55:21 +09:00
console.log(
JSON.stringify(ret) == JSON.stringify(a),
JSON.stringify(a) == JSON.stringify(b)
);
```
2019-03-05 14:33:33 +09:00
2019-03-06 23:50:10 +09:00
### javascript - jsonpath.compile(jsonpath: string)
2019-03-05 14:33:33 +09:00
2019-03-06 18:55:21 +09:00
```javascript
let template = jsonpath.compile("$..friends[0]");
2019-03-04 23:29:09 +09:00
2019-03-06 18:55:21 +09:00
let jsonObj = {
"school": {
"friends": [ {"id": 0}, {"id": 1} ]
},
"friends": [ {"id": 0}, {"id": 1} ]
};
2019-03-04 23:29:09 +09:00
2019-03-06 23:50:10 +09:00
let ret = JSON.stringify([ {"id": 0}, {"id": 0} ]);
2019-03-06 18:55:21 +09:00
// 1. read as json object
2019-03-06 23:50:10 +09:00
console.log(JSON.stringify(template(jsonObj)) == ret);
2019-03-06 18:55:21 +09:00
// 2. read as json string
2019-03-06 23:50:10 +09:00
console.log(JSON.stringify(template(JSON.stringify(jsonObj))) == ret);
2019-03-06 18:55:21 +09:00
let jsonObj2 = {
"school": {
2019-03-06 23:50:10 +09:00
"friends": [
{"name": "Millicent Norman"},
{"name": "Vincent Cannon"}
]
2019-03-06 18:55:21 +09:00
},
"friends": [ {"id": 0}, {"id": 1} ]
};
2019-03-06 23:50:10 +09:00
let ret2 = JSON.stringify([ {"id": 0}, {"name": "Millicent Norman"} ]);
2019-03-06 18:55:21 +09:00
// 1. read as json object
2019-03-06 23:50:10 +09:00
console.log(JSON.stringify(template(jsonObj2)) == ret2);
2019-03-06 18:55:21 +09:00
// 2. read as json string
2019-03-06 23:50:10 +09:00
console.log(JSON.stringify(template(JSON.stringify(jsonObj2))) == ret2);
2019-03-05 14:33:33 +09:00
```
2019-03-11 17:35:15 +09:00
### javascript - jsonpath.selector(json: string|object)
2019-03-04 23:29:09 +09:00
2019-03-06 18:55:21 +09:00
```javascript
let jsonObj = {
"school": {
"friends": [{"id": 0}, {"id": 1}]
},
"friends": [{"id": 0},{"id": 1}]
};
2019-03-04 23:29:09 +09:00
2019-03-06 23:50:10 +09:00
let ret1 = JSON.stringify([ {"id": 0}, {"id": 0} ]);
let ret2 = JSON.stringify([ {"id": 1}, {"id": 1} ]);
2019-03-06 18:55:21 +09:00
// 1. read as json object
2019-03-11 17:35:15 +09:00
let selector = jsonpath.selector(jsonObj);
console.log(JSON.stringify(selector("$..friends[0]")) == ret1);
console.log(JSON.stringify(selector("$..friends[1]")) == ret2);
2019-03-06 18:55:21 +09:00
// 2. read as json string
2019-03-11 17:35:15 +09:00
let selector = jsonpath.selector(JSON.stringify(jsonObj));
console.log(JSON.stringify(selector("$..friends[0]")) == ret1);
console.log(JSON.stringify(selector("$..friends[1]")) == ret2);
```
### javascript - alloc_json, dealloc_json
2019-03-17 18:25:00 +09:00
*(in `jsonpath-rs` not yet supported)*
2019-03-11 17:35:15 +09:00
wasm-bindgen은 Javascript와 Webassembly 간 값을 주고받을 때 JSON 객체는 String으로 변환되기 때문에, 반복해서 사용되는 JSON 객체를 Webassembly 영역에 생성해 두면 성능에 도움이 된다.
Since wasm-bindgen converts JSON objects to String when exchanging values between Javascript and Webassembly, it is helpful to create repeated Json objects in Webassembly area.
```javascript
let jsonObj = {
"school": {
"friends": [{"id": 0}, {"id": 1}]
},
"friends": [{"id": 0},{"id": 1}]
};
let path = '$..friends[0]';
let template = jsonpath.compile(path);
let selector = jsonpath.selector(jsonObj);
let ptr = jsonpath.alloc_json(jsonObj);
if(ptr == 0) console.error('invalid ptr'); // `0` is invalid pointer
let selector2 = jsonpath.selector(ptr);
let ret1 = selector(path)
let ret2 = selector2(path)
let ret3 = template(jsonObj);
let ret4 = template(ptr);
let ret5 = jsonpath.select(jsonObj, path);
let ret6 = jsonpath.select(ptr, path);
console.log(
JSON.stringify(ret1) == JSON.stringify(ret2),// true
JSON.stringify(ret1) == JSON.stringify(ret3),// true
JSON.stringify(ret1) == JSON.stringify(ret4),// true
JSON.stringify(ret1) == JSON.stringify(ret5),// true
JSON.stringify(ret1) == JSON.stringify(ret6));// true
jsonpath.dealloc_json(ptr);
2019-03-05 14:33:33 +09:00
```
2019-03-04 23:29:09 +09:00
2019-03-05 23:48:27 +09:00
## With Rust (as library)
2018-12-26 14:45:31 +09:00
2019-03-06 23:50:10 +09:00
### jsonpath_lib library
2019-03-06 18:55:21 +09:00
```rust
extern crate jsonpath_lib as jsonpath;
#[macro_use]
extern crate serde_json;
```
2019-03-18 10:59:08 +09:00
### rust - jsonpath::select(json: &serde_json::value::Value, jsonpath: &str)
2019-03-06 18:55:21 +09:00
```rust
let json_obj = json!({
"school": {
"friends": [{"id": 0}, {"id": 1}]
},
"friends": [{"id": 0}, {"id": 1}]
});
2019-03-11 17:35:15 +09:00
let json = jsonpath::select(json_obj, "$..friends[0]").unwrap();
2019-03-06 18:55:21 +09:00
let ret = json!([ {"id": 0}, {"id": 0} ]);
assert_eq!(json, ret)
```
2019-03-24 21:18:58 +09:00
### rust - jsonpath::select_as_str(json: &str, jsonpath: &str)
2019-03-18 10:59:08 +09:00
```rust
2019-03-24 21:18:58 +09:00
let ret = jsonpath::select_as_str(r#"{
2019-03-23 11:51:35 +09:00
"school": { "friends": [{"id": 0}, {"id": 1}] },
2019-03-18 10:59:08 +09:00
"friends": [{"id": 0}, {"id": 1}]
2019-03-23 11:51:35 +09:00
}"#, "$..friends[0]").unwrap();
assert_eq!(ret, r#"[{"id":0},{"id":0}]"#);
2019-03-18 10:59:08 +09:00
```
2019-03-24 21:18:58 +09:00
### rust - jsonpath::select_as\<T\>(json: &str, jsonpath: &str)
```rust
#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Person {
name: String,
age: u8,
phones: Vec< String > ,
}
let ret: Person = jsonpath::select_as(r#"
{
"person":
{
"name": "Doe John",
"age": 44,
"phones": [
"+44 1234567",
"+44 2345678"
]
}
}
"#, "$.person").unwrap();
let person = Person {
name: "Doe John".to_string(),
age: 44,
phones: vec!["+44 1234567".to_string(), "+44 2345678".to_string()],
};
assert_eq!(person, ret);
```
2019-03-06 23:50:10 +09:00
### rust - jsonpath::compile(jsonpath: &str)
2019-03-06 18:55:21 +09:00
```rust
let mut template = jsonpath::compile("$..friends[0]");
let json_obj = json!({
"school": {
"friends": [ {"id": 0}, {"id": 1} ]
},
"friends": [ {"id": 0}, {"id": 1} ]
});
2019-03-17 18:25:00 +09:00
let json = template(&json_obj).unwrap();
2019-03-06 18:55:21 +09:00
let ret = json!([ {"id": 0}, {"id": 0} ]);
assert_eq!(json, ret);
let json_obj = json!({
"school": {
"friends": [ {"name": "Millicent Norman"}, {"name": "Vincent Cannon"} ]
},
"friends": [ {"id": 0}, {"id": 1} ]
});
let json = template(json_obj).unwrap();
let ret = json!([ {"id": 0}, {"name": "Millicent Norman"} ]);
assert_eq!(json, ret);
```
2019-03-17 18:25:00 +09:00
### rust - jsonpath::selector(&json: serde_json::value::Value)
2019-03-06 18:55:21 +09:00
```rust
let json_obj = json!({
"school": {
"friends": [{"id": 0}, {"id": 1}]
},
"friends": [{"id": 0},{"id": 1}]
});
2019-03-17 18:25:00 +09:00
let mut selector = jsonpath::selector(&json_obj);
2019-03-06 18:55:21 +09:00
2019-03-11 17:35:15 +09:00
let json = selector("$..friends[0]").unwrap();
2019-03-06 18:55:21 +09:00
let ret = json!([ {"id": 0}, {"id": 0} ]);
assert_eq!(json, ret);
2019-03-11 17:35:15 +09:00
let json = selector("$..friends[1]").unwrap();
2019-03-06 18:55:21 +09:00
let ret = json!([ {"id": 1}, {"id": 1} ]);
assert_eq!(json, ret);
```