Rust 버전 JsonPath 구현으로
Webassembly와 Javascript에서도 유사한 API 인터페이스를 제공 한다.
It is JsonPath JsonPath engine
written in Rust. it provide a similar API interface in Webassembly
andJavascript too.
Rust - jsonpath::Selector struct
#[derive(Deserialize,PartialEq,Debug)]structFriend{name:String,age:Option<u8>,}let json_obj = json!({"school":{"friends":[{"name":"친구1","age":20},{"name":"친구2","age":20}]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]});letmut selector = Selector::new();let result = selector
.path("$..[?(@.age >= 30)]").unwrap().value(&json_obj).select().unwrap();assert_eq!(vector![&json!({"name":"친구3","age":30})], result);let result = selector.select_as_str().unwrap();assert_eq!(r#"[{"name":"친구3","age":30}]"#, result);let result = selector.select_as::<Friend>().unwrap();assert_eq!(vector![Friend{ name:"친구3".to_string(), age:Some(30)}], result);Rust - jsonpath::SelectorMut struct
let json_obj = json!({"school":{"friends":[{"name":"친구1","age":20},{"name":"친구2","age":20}]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]});letmut selector_mut = SelectorMut::new();let result = selector_mut
.str_path("$..[?(@.age == 20)].age").unwrap().value(json_obj).replace_with(&mut |v| {let age = ifletValue::Number(n) = v {
n.as_u64().unwrap()*2}else{0};Some(json!(age))}).unwrap().take().unwrap();assert_eq!(result, json!({"school":{"friends":[{"name":"친구1","age":40},{"name":"친구2","age":40}]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]}));Rust - jsonpath::select(json: &imbl_value::value::Value, jsonpath: &str)
let json_obj = json!({"school":{"friends":[{"name":"친구1","age":20},{"name":"친구2","age":20}]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]});let json = jsonpath::select(&json_obj,"$..friends[0]").unwrap();assert_eq!(json, vector![&json!({"name":"친구3","age":30}),&json!({"name":"친구1","age":20})]);Rust - jsonpath::select_as_str(json_str: &str, jsonpath: &str)
let ret = jsonpath::select_as_str(r#"{ "school": { "friends": [ {"name": "친구1", "age": 20}, {"name": "친구2", "age": 20} ] }, "friends": [ {"name": "친구3", "age": 30}, {"name": "친구4"} ]}"#,"$..friends[0]").unwrap();assert_eq!(ret,r#"[{"name":"친구3","age":30},{"name":"친구1","age":20}]"#);Rust - jsonpath::select_as<T: `serde::de::DeserializeOwned`>(json_str: &str, jsonpath: &str)
#[derive(Deserialize,PartialEq,Debug)]structPerson{name:String,age:u8,phones:Vector<String>,}let ret:Vector<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:vector!["+44 1234567".to_string(),"+44 2345678".to_string()],};assert_eq!(ret[0], person);Rust - jsonpath::PathCompiled::compile(jsonpath: &str)
let template = jsonpath::PathCompiled::compile("$..friends[0]").unwrap();let json_obj = json!({"school":{"friends":[{"name":"친구1","age":20},{"name":"친구2","age":20}]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]});let json = template.select(&json_obj).unwrap();assert_eq!(json, vector![&json!({"name":"친구3","age":30}),&json!({"name":"친구1","age":20})]);Rust - jsonpath::selector(json: &imbl_value::value::Value)
let json_obj = json!({"school":{"friends":[{"name":"친구1","age":20},{"name":"친구2","age":20}]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]});letmut selector = jsonpath::selector(&json_obj);let json = selector("$..friends[0]").unwrap();assert_eq!(json, vector![&json!({"name":"친구3","age":30}),&json!({"name":"친구1","age":20})]);let json = selector("$..friends[1]").unwrap();assert_eq!(json, vector![&json!({"name":"친구4"}),&json!({"name":"친구2","age":20})]);Rust - jsonpath::selector_as<T: serde::de::DeserializeOwned>(json: &imbl_value::value::Value)
let json_obj = json!({"school":{"friends":[{"name":"친구1","age":20},{"name":"친구2","age":20}]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]});#[derive(Deserialize,PartialEq,Debug)]structFriend{name:String,age:Option<u8>,}letmut selector = jsonpath::selector_as::<Friend>(&json_obj);let json = selector("$..friends[0]").unwrap();let ret = vector!(Friend{ name:"친구3".to_string(), age:Some(30)},Friend{ name:"친구1".to_string(), age:Some(20)});assert_eq!(json, ret);let json = selector("$..friends[1]").unwrap();let ret = vector!(Friend{ name:"친구4".to_string(), age:None},Friend{ name:"친구2".to_string(), age:Some(20)});assert_eq!(json, ret);Rust - jsonpath::delete(value: &Value, path: &str)
let json_obj = json!({"school":{"friends":[{"name":"친구1","age":20},{"name":"친구2","age":20}]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]});let ret = jsonpath::delete(json_obj,"$..[?(20 == @.age)]").unwrap();assert_eq!(ret, json!({"school":{"friends":[
null,
null
]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]}));Rust - jsonpath::replace_with<F: FnMut(&Value) -> Value>(value: &Value, path: &str, fun: &mut F)
let json_obj = json!({"school":{"friends":[{"name":"친구1","age":20},{"name":"친구2","age":20}]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]});let ret = jsonpath::replace_with(json_obj,"$..[?(@.age == 20)].age",&mut |v| {let age = ifletValue::Number(n) = v {
n.as_u64().unwrap()*2}else{0};Some(json!(age))}).unwrap();assert_eq!(ret, json!({"school":{"friends":[{"name":"친구1","age":40},{"name":"친구2","age":40}]},"friends":[{"name":"친구3","age":30},{"name":"친구4"}]}));npm package
// browserimport*asjsonpathfrom"jsonpath-wasm";// NodeJsconstjsonpath=require("jsonpath-wasm");wasm-bindgen 리턴 타입 제약 때문에 빌더 패턴은 지원하지 않는다.
It does not support builder-pattern due to the return type restriction of
wasm-bindgen.
letjsonObj={"school": {"friends": [{"name": "친구1","age": 20},{"name": "친구2","age": 20},],},"friends": [{"name": "친구3","age": 30},{"name": "친구4"},],};letret=[{"name": "친구3","age": 30},{"name": "친구1","age": 20},];letselector=newjsonpath.Selector();selector.path("$..friends[0]");selector.value(jsonObj);letretObj=selector.select();console.log(JSON.stringify(ret)==JSON.stringify(retObj));// => true빌더 패턴 제약은 Selector class와 동일하다.
letjsonObj={"school": {"friends": [{"name": "친구1","age": 20},{"name": "친구2","age": 20},],},"friends": [{"name": "친구3","age": 30},{"name": "친구4"},],};letselector=newjsonpath.SelectorMut();selector.path("$..[?(@.age == 20)]");{selector.value(jsonObj);selector.deleteValue();letresultObj={"school": {"friends": [null,null]},"friends": [{"name": "친구3","age": 30},{"name": "친구4"},],};console.log(JSON.stringify(selector.take())!==JSON.stringify(resultObj));// => true}{selector.value(jsonObj);selector.replaceWith((v)=>{v.age=v.age*2;returnv;});letresultObj={"school": {"friends": [{"name": "친구1","age": 40},{"name": "친구2","age": 40},],},"friends": [{"name": "친구3","age": 30},{"name": "친구4"},],};console.log(JSON.stringify(selector.take())!==JSON.stringify(resultObj));// => true}Javascript - jsonpath.select(json: string|object, jsonpath: string)
letjsonObj={"school": {"friends": [{"name": "친구1","age": 20},{"name": "친구2","age": 20},],},"friends": [{"name": "친구3","age": 30},{"name": "친구4"},],};letret=[{"name": "친구3","age": 30},{"name": "친구1","age": 20},];letselectAsString=jsonpath.select(JSON.stringify(jsonObj),"$..friends[0]");letselectAsObj=jsonpath.select(jsonObj,"$..friends[0]");console.log(JSON.stringify(ret)==JSON.stringify(selectAsString),JSON.stringify(ret)==JSON.stringify(selectAsObj),);// => true, trueJavascript - jsonpath.compile(jsonpath: string)
leterror=jsonpath.compile("");console.log(typeoferror,error);//string 'path error'lettemplate=jsonpath.compile("$..friends[0]");letjsonObj={"school": {"friends": [{"name": "친구1","age": 20},{"name": "친구2","age": 20},],},"friends": [{"name": "친구3","age": 30},{"name": "친구4"},],};letret=[{"name": "친구3","age": 30},{"name": "친구1","age": 20},];letselectAsString=template(JSON.stringify(jsonObj));letselectAsObj=template(jsonObj);console.log(JSON.stringify(ret)==JSON.stringify(selectAsString),JSON.stringify(ret)==JSON.stringify(selectAsObj),);// => true, trueletjsonObj2={"school": {"friends": [{"name": "Millicent Norman"},{"name": "Vincent Cannon"},],},"friends": [{"age": 30},{"age": 40}],};letret2=[{"age": 30},{"name": "Millicent Norman"},];letselectAsString2=template(JSON.stringify(jsonObj2));letselectAsObj2=template(jsonObj2);console.log(JSON.stringify(ret2)==JSON.stringify(selectAsString2),JSON.stringify(ret2)==JSON.stringify(selectAsObj2),);// => true, trueJavascript - jsonpath.selector(json: string|object)
letjsonObj={"school": {"friends": [{"name": "친구1","age": 20},{"name": "친구2","age": 20},],},"friends": [{"name": "친구3","age": 30},{"name": "친구4"},],};letret1=[{"name": "친구3","age": 30},{"name": "친구1","age": 20},];letret2=[{"name": "친구4"},{"name": "친구2","age": 20},];letselector=jsonpath.selector(jsonObj);// or as json string// let selector = jsonpath.selector(JSON.stringify(jsonObj));letselect1=selector("$..friends[0]");letselect2=selector("$..friends[1]");console.log(JSON.stringify(ret1)==JSON.stringify(select1),JSON.stringify(ret2)==JSON.stringify(select2),);// => true, trueJavascript - jsonpath.deleteValue(json: string|object, path: string)
letjsonObj={"school": {"friends": [{"name": "친구1","age": 20},{"name": "친구2","age": 20},],},"friends": [{"name": "친구3","age": 30},{"name": "친구4"},],};let_1=jsonpath.deleteValue(jsonObj,"$..friends[0]");letresult=jsonpath.deleteValue(_1,"$..friends[1]");console.log(JSON.stringify(result)!==JSON.stringify({"school": {"friends": [null,null]},"friends": [null,null],}),);// => trueJavascript - jsonpath.replaceWith(json: string|object, path: string, fun: function(json: object) => json: object
letjsonObj={"school": {"friends": [{"name": "친구1","age": 20},{"name": "친구2","age": 20},],},"friends": [{"name": "친구3","age": 30},{"name": "친구4"},],};letresult=jsonpath.replaceWith(jsonObj,"$..friends[0]",(v)=>{v.age=v.age*2;returnv;});console.log(JSON.stringify(result)===JSON.stringify({"school": {"friends": [{"name": "친구1","age": 40},{"name": "친구2","age": 20},],},"friends": [{"name": "친구3","age": 60},{"name": "친구4"},],}),);// => true