{"id":13439973,"url":"https://github.com/freestrings/jsonpath","last_synced_at":"2025-04-15T00:47:11.616Z","repository":{"id":34267849,"uuid":"163121779","full_name":"freestrings/jsonpath","owner":"freestrings","description":"JsonPath engine written in Rust. Webassembly and Javascript support too","archived":false,"fork":false,"pushed_at":"2025-01-22T14:48:10.000Z","size":30036,"stargazers_count":126,"open_issues_count":26,"forks_count":40,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-15T00:46:50.101Z","etag":null,"topics":["javascript","json","jsonpath","nodejs","parsing","query","rustlang","webassembly"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/freestrings.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-12-26T01:13:40.000Z","updated_at":"2025-04-03T06:03:13.000Z","dependencies_parsed_at":"2024-06-18T18:38:07.195Z","dependency_job_id":"1cbd57fe-8d3e-4038-8150-ea7af03b8c33","html_url":"https://github.com/freestrings/jsonpath","commit_stats":{"total_commits":259,"total_committers":10,"mean_commits":25.9,"dds":0.1853281853281853,"last_synced_commit":"1a84c5af9445e617a6deed14dadfaee13af0d95f"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freestrings%2Fjsonpath","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freestrings%2Fjsonpath/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freestrings%2Fjsonpath/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/freestrings%2Fjsonpath/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/freestrings","download_url":"https://codeload.github.com/freestrings/jsonpath/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248986278,"owners_count":21194025,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","json","jsonpath","nodejs","parsing","query","rustlang","webassembly"],"created_at":"2024-07-31T03:01:18.620Z","updated_at":"2025-04-15T00:47:11.598Z","avatar_url":"https://github.com/freestrings.png","language":"Rust","funding_links":[],"categories":["Libraries","库 Libraries","Rust","库"],"sub_categories":["Parsing","解析 Parsing","解析"],"readme":"# jsonpath_lib\n\n[![Build Status](https://travis-ci.org/freestrings/jsonpath.svg?branch=master)](https://travis-ci.org/freestrings/jsonpath)\n![crates.io](https://img.shields.io/crates/v/jsonpath_lib.svg)\n![npm](https://img.shields.io/npm/v/jsonpath-wasm.svg?label=npm%20%60jsonpath-wasm%60)\n[![codecov](https://codecov.io/github/freestrings/jsonpath/graph/badge.svg?token=xLtsYrqvi9)](https://codecov.io/github/freestrings/jsonpath)\n\n`Rust` 버전 [JsonPath](https://goessner.net/articles/JsonPath/) 구현으로 `Webassembly`와 `Javascript`에서도 유사한 API 인터페이스를 제공 한다.\n\nIt is JsonPath [JsonPath](https://goessner.net/articles/JsonPath/) engine written in `Rust`. it provide a similar API interface in `Webassembly` and` Javascript` too.\n\n- [Webassembly Demo](https://freestrings.github.io/jsonpath/)\n- [NPM jsonpath-wasm - webassembly](https://www.npmjs.com/package/jsonpath-wasm)\n\n## Rust API\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003ejsonpath_lib crate\u003c/b\u003e\u003c/summary\u003e\n\nGo to [`jsonpath_lib` creates.io](https://crates.io/crates/jsonpath_lib)\n\n```rust\nextern crate jsonpath_lib as jsonpath;\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRust - jsonpath::Selector struct\u003c/b\u003e\u003c/summary\u003e\n\n```rust\n#[derive(Deserialize, PartialEq, Debug)]\nstruct Friend {\n    name: String,\n    age: Option\u003cu8\u003e,\n}\n\nlet json_obj = json!({\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]});\n\nlet mut selector = Selector::new();\n\nlet result = selector\n    .path(\"$..[?(@.age \u003e= 30)]\").unwrap()\n    .value(\u0026json_obj)\n    .select().unwrap();\n\nassert_eq!(vec![\u0026json!({\"name\": \"친구3\", \"age\": 30})], result);\n\nlet result = selector.select_as_str().unwrap();\nassert_eq!(r#\"[{\"name\":\"친구3\",\"age\":30}]\"#, result);\n\nlet result = selector.select_as::\u003cFriend\u003e().unwrap();\nassert_eq!(vec![Friend { name: \"친구3\".to_string(), age: Some(30) }], result);\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRust - jsonpath::SelectorMut struct\u003c/b\u003e\u003c/summary\u003e\n\n```rust\nlet json_obj = json!({\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]});\n\nlet mut selector_mut = SelectorMut::new();\n\nlet result = selector_mut\n    .str_path(\"$..[?(@.age == 20)].age\").unwrap()\n    .value(json_obj)\n    .replace_with(\u0026mut |v| {\n        let age = if let Value::Number(n) = v {\n            n.as_u64().unwrap() * 2\n        } else {\n            0\n        };\n\n        Some(json!(age))\n    }).unwrap()\n    .take().unwrap();\n\nassert_eq!(result, json!({\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 40},\n            {\"name\": \"친구2\", \"age\": 40}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]}));\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRust - jsonpath::select(json: \u0026serde_json::value::Value, jsonpath: \u0026str)\u003c/b\u003e\u003c/summary\u003e\n\n```rust\nlet json_obj = json!({\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]});\n\nlet json = jsonpath::select(\u0026json_obj, \"$..friends[0]\").unwrap();\n\nassert_eq!(json, vec![\n    \u0026json!({\"name\": \"친구3\", \"age\": 30}),\n    \u0026json!({\"name\": \"친구1\", \"age\": 20})\n]);\n```\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRust - jsonpath::select_as_str(json_str: \u0026str, jsonpath: \u0026str)\u003c/b\u003e\u003c/summary\u003e\n\n```rust\nlet ret = jsonpath::select_as_str(r#\"\n{\n    \"school\": {\n        \"friends\": [\n                {\"name\": \"친구1\", \"age\": 20},\n                {\"name\": \"친구2\", \"age\": 20}\n            ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n    ]\n}\n\"#, \"$..friends[0]\").unwrap();\n\nassert_eq!(ret, r#\"[{\"name\":\"친구3\",\"age\":30},{\"name\":\"친구1\",\"age\":20}]\"#);\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRust - jsonpath::select_as\u0026lt;T: `serde::de::DeserializeOwned`\u0026gt;(json_str: \u0026str, jsonpath: \u0026str)\u003c/b\u003e\u003c/summary\u003e\n\n```rust\n#[derive(Deserialize, PartialEq, Debug)]\nstruct Person {\n    name: String,\n    age: u8,\n    phones: Vec\u003cString\u003e,\n}\n\nlet ret: Vec\u003cPerson\u003e = jsonpath::select_as(r#\"\n{\n    \"person\":\n        {\n            \"name\": \"Doe John\",\n            \"age\": 44,\n            \"phones\": [\n                \"+44 1234567\",\n                \"+44 2345678\"\n            ]\n        }\n}\n\"#, \"$.person\").unwrap();\n\nlet person = Person {\n    name: \"Doe John\".to_string(),\n    age: 44,\n    phones: vec![\"+44 1234567\".to_string(), \"+44 2345678\".to_string()],\n};\n\nassert_eq!(ret[0], person);\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRust - jsonpath::PathCompiled::compile(jsonpath: \u0026str)\u003c/b\u003e\u003c/summary\u003e\n\n```rust\nlet template = jsonpath::PathCompiled::compile(\"$..friends[0]\").unwrap();\n\nlet json_obj = json!({\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]});\n\nlet json = template.select(\u0026json_obj).unwrap();\n\nassert_eq!(json, vec![\n    \u0026json!({\"name\": \"친구3\", \"age\": 30}),\n    \u0026json!({\"name\": \"친구1\", \"age\": 20})\n]);\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRust - jsonpath::selector(json: \u0026serde_json::value::Value)\u003c/b\u003e\u003c/summary\u003e\n\n```rust\nlet json_obj = json!({\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]});\n\nlet mut selector = jsonpath::selector(\u0026json_obj);\n\nlet json = selector(\"$..friends[0]\").unwrap();\n\nassert_eq!(json, vec![\n    \u0026json!({\"name\": \"친구3\", \"age\": 30}),\n    \u0026json!({\"name\": \"친구1\", \"age\": 20})\n]);\n\nlet json = selector(\"$..friends[1]\").unwrap();\n\nassert_eq!(json, vec![\n    \u0026json!({\"name\": \"친구4\"}),\n    \u0026json!({\"name\": \"친구2\", \"age\": 20})\n]);\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRust - jsonpath::selector_as\u0026lt;T: serde::de::DeserializeOwned\u0026gt;(json: \u0026serde_json::value::Value)\u003c/b\u003e\u003c/summary\u003e\n\n```rust\nlet json_obj = json!({\n    \"school\": {\n       \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]});\n\n#[derive(Deserialize, PartialEq, Debug)]\nstruct Friend {\n    name: String,\n    age: Option\u003cu8\u003e,\n}\n\nlet mut selector = jsonpath::selector_as::\u003cFriend\u003e(\u0026json_obj);\n\nlet json = selector(\"$..friends[0]\").unwrap();\n\nlet ret = vec!(\n    Friend { name: \"친구3\".to_string(), age: Some(30) },\n    Friend { name: \"친구1\".to_string(), age: Some(20) }\n);\nassert_eq!(json, ret);\n\nlet json = selector(\"$..friends[1]\").unwrap();\n\nlet ret = vec!(\n    Friend { name: \"친구4\".to_string(), age: None },\n    Friend { name: \"친구2\".to_string(), age: Some(20) }\n);\n\nassert_eq!(json, ret);\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRust - jsonpath::delete(value: \u0026Value, path: \u0026str)\u003c/b\u003e\u003c/summary\u003e\n\n```rust\nlet json_obj = json!({\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]});\n\nlet ret = jsonpath::delete(json_obj, \"$..[?(20 == @.age)]\").unwrap();\n\nassert_eq!(ret, json!({\n    \"school\": {\n        \"friends\": [\n            null,\n            null\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]}));\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRust - jsonpath::replace_with\u0026lt;F: FnMut(\u0026Value) -\u003e Value\u0026gt;(value: \u0026Value, path: \u0026str, fun: \u0026mut F)\u003c/b\u003e\u003c/summary\u003e\n\n```rust\nlet json_obj = json!({\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]});\n\nlet ret = jsonpath::replace_with(json_obj, \"$..[?(@.age == 20)].age\", \u0026mut |v| {\n    let age = if let Value::Number(n) = v {\n        n.as_u64().unwrap() * 2\n    } else {\n        0\n    };\n\n    Some(json!(age))\n}).unwrap();\n\nassert_eq!(ret, json!({\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 40},\n            {\"name\": \"친구2\", \"age\": 40}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n]}));\n```\n\n\u003c/details\u003e\n\n[Rust - Other Examples](https://github.com/freestrings/jsonpath/wiki/rust-examples)\n\n## Javascript API\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003enpm package\u003c/b\u003e\u003c/summary\u003e\n\n##### jsonpath-wasm\n\nGoto [`jsonpath-wasm` npmjs.org](https://www.npmjs.com/package/jsonpath-wasm)\n\n```javascript\n// browser\nimport * as jsonpath from \"jsonpath-wasm\";\n// NodeJs\nconst jsonpath = require('jsonpath-wasm');\n```\n\n##### jsonpath-wasm\n`wasm-bindgen` 리턴 타입 제약 때문에 빌더 패턴은 지원하지 않는다.\n\nIt does not support `builder-pattern` due to the `return type` restriction of `wasm-bindgen`.\n\n```javascript\nlet jsonObj = {\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n    ]\n};\n\nlet ret = [\n    {\"name\": \"친구3\", \"age\": 30},\n    {\"name\": \"친구1\", \"age\": 20}\n];\n\nlet selector = new jsonpath.Selector();\nselector.path('$..friends[0]');\nselector.value(jsonObj);\n\nlet retObj = selector.select();\n\nconsole.log(JSON.stringify(ret) == JSON.stringify(retObj));\n\n// =\u003e true\n```\n\n빌더 패턴 제약은 `Selector class`와 동일하다.\n\n```javascript\nlet jsonObj = {\n    'school': {\n        'friends': [\n            {'name': '친구1', 'age': 20},\n            {'name': '친구2', 'age': 20},\n        ],\n    },\n    'friends': [\n        {'name': '친구3', 'age': 30},\n        {'name': '친구4'},\n    ],\n};\n\nlet selector = new jsonpath.SelectorMut();\nselector.path('$..[?(@.age == 20)]');\n\n{\n    selector.value(jsonObj);\n    selector.deleteValue();\n\n    let resultObj = {\n        'school': {'friends': [null, null]},\n        'friends': [\n            {'name': '친구3', 'age': 30},\n            {'name': '친구4'},\n        ],\n    };\n    console.log(JSON.stringify(selector.take()) !== JSON.stringify(resultObj));\n    \n    // =\u003e true\n}\n\n{\n    selector.value(jsonObj);\n    selector.replaceWith((v) =\u003e {\n        v.age = v.age * 2;\n        return v;\n    });\n\n    let resultObj = {\n        'school': {\n            'friends': [\n                {'name': '친구1', 'age': 40},\n                {'name': '친구2', 'age': 40},\n            ],\n        },\n        'friends': [\n            {'name': '친구3', 'age': 30},\n            {'name': '친구4'},\n        ],\n    };\n    console.log(JSON.stringify(selector.take()) !== JSON.stringify(resultObj));\n    \n    // =\u003e true\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eJavascript - jsonpath.select(json: string|object, jsonpath: string)\u003c/b\u003e\u003c/summary\u003e\n\n```javascript\nlet jsonObj = {\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n    ]\n};\n\nlet ret = [\n    {\"name\": \"친구3\", \"age\": 30},\n    {\"name\": \"친구1\", \"age\": 20}\n];\n\n\nlet selectAsString = jsonpath.select(JSON.stringify(jsonObj), '$..friends[0]');\nlet selectAsObj = jsonpath.select(jsonObj, '$..friends[0]');\n\nconsole.log(\n    JSON.stringify(ret) == JSON.stringify(selectAsString),\n    JSON.stringify(ret) == JSON.stringify(selectAsObj)\n);\n\n// =\u003e true, true\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eJavascript - jsonpath.compile(jsonpath: string)\u003c/b\u003e\u003c/summary\u003e\n\n```javascript\nlet error = jsonpath.compile('');\nconsole.log(typeof error, error); //string 'path error'\n\nlet template = jsonpath.compile('$..friends[0]');\n\nlet jsonObj = {\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n    ]\n};\n\nlet ret = [\n    {\"name\": \"친구3\", \"age\": 30},\n    {\"name\": \"친구1\", \"age\": 20}\n];\n\nlet selectAsString = template(JSON.stringify(jsonObj));\nlet selectAsObj = template(jsonObj);\n\nconsole.log(\n    JSON.stringify(ret) == JSON.stringify(selectAsString),\n    JSON.stringify(ret) == JSON.stringify(selectAsObj)\n);\n\n// =\u003e true, true\n\nlet jsonObj2 = {\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"Millicent Norman\"},\n            {\"name\": \"Vincent Cannon\"}\n        ]\n    },\n    \"friends\": [ {\"age\": 30}, {\"age\": 40} ]\n};\n\nlet ret2 = [\n    {\"age\": 30},\n    {\"name\": \"Millicent Norman\"}\n];\n\nlet selectAsString2 = template(JSON.stringify(jsonObj2));\nlet selectAsObj2 = template(jsonObj2);\n\nconsole.log(\n        JSON.stringify(ret2) == JSON.stringify(selectAsString2),\n        JSON.stringify(ret2) == JSON.stringify(selectAsObj2)\n);\n\n// =\u003e true, true\n```\n    \n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eJavascript - jsonpath.selector(json: string|object)\u003c/b\u003e\u003c/summary\u003e\n\n```javascript\nlet jsonObj = {\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n    ]\n};\n\nlet ret1 = [\n    {\"name\": \"친구3\", \"age\": 30},\n    {\"name\": \"친구1\", \"age\": 20}\n];\n\nlet ret2 = [\n    {\"name\": \"친구4\"},\n    {\"name\": \"친구2\", \"age\": 20}\n];\n\nlet selector = jsonpath.selector(jsonObj);\n// or as json string \n// let selector = jsonpath.selector(JSON.stringify(jsonObj));\n\nlet select1 = selector('$..friends[0]');\nlet select2 = selector('$..friends[1]');\n\nconsole.log(\n    JSON.stringify(ret1) == JSON.stringify(select1),\n    JSON.stringify(ret2) == JSON.stringify(select2)\n);\n\n// =\u003e true, true\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eJavascript - jsonpath.deleteValue(json: string|object, path: string)\u003c/b\u003e\u003c/summary\u003e\n\n```javascript\nlet jsonObj = {\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n    ]\n};\n\nlet _1 = jsonpath.deleteValue(jsonObj, '$..friends[0]');\nlet result = jsonpath.deleteValue(_1, '$..friends[1]');\n\nconsole.log(JSON.stringify(result) !== JSON.stringify({\n    \"school\": { \"friends\": [null, null]},\n    \"friends\": [null, null]\n}));\n\n// =\u003e true\n\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eJavascript - jsonpath.replaceWith(json: string|object, path: string, fun: function(json: object) =\u003e json: object\u003c/b\u003e\u003c/summary\u003e\n\n```javascript\nlet jsonObj = {\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 20},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 30},\n        {\"name\": \"친구4\"}\n    ]\n};\n\nlet result = jsonpath.replaceWith(jsonObj, '$..friends[0]', (v) =\u003e {\n    v.age = v.age * 2;\n    return v;\n});\n\nconsole.log(JSON.stringify(result) === JSON.stringify({\n    \"school\": {\n        \"friends\": [\n            {\"name\": \"친구1\", \"age\": 40},\n            {\"name\": \"친구2\", \"age\": 20}\n        ]\n    },\n    \"friends\": [\n        {\"name\": \"친구3\", \"age\": 60},\n        {\"name\": \"친구4\"}\n    ]\n}));\n\n// =\u003e true\n\n```\n\n\u003c/details\u003e\n\n[Javascript - Other Examples](https://github.com/freestrings/jsonpath/wiki/Javascript-examples)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreestrings%2Fjsonpath","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffreestrings%2Fjsonpath","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffreestrings%2Fjsonpath/lists"}