Java中的Json Path和Json Merge Patch
Java中的Json Patch和Json Merge Patch都做得很好-一種表示對源json結構進行更改的方法。 Json Patch透過一系列轉換源文件的操作來完成它,而Json Merge Patch將更改表示為源文件的精簡版。
源文件:
{ "title": "Goodbye!", "author": { "givenName": "John", "familyName": "Doe" }, "tags": [ "example", "sample" ], "content": "This will be unchanged" } |
轉換目標文件為:
{ "title": "Hello!", "author": { "givenName": "John" }, "tags": [ "example" ], "content": "This will be unchanged", "phoneNumber": "+01-123-456-7890" } |
對比兩種JSON文件,所作的合併的更改集為:
- title 被更改
- Author/familyName已刪除
- tags之一被刪除
- 新增 phone number
Json Patch
這種改變可以使用Json Patch 表達:
[ { "op": "replace", "path": "/title", "value": "Hello!"}, { "op": "remove", "path": "/author/familyName"}, { "op": "add", "path": "/phoneNumber", "value": "+01-123-456-7890"}, { "op": "replace", "path": "/tags", "value": ["example"]} ] |
透過上述一系列操作將源文件轉換為目標文件。操作可以是“新增”,“刪除”,“替換”,“移動”,“複製”或“測試”之一,並且在示例中與diff完全匹配。
Json Merge Patch
Json merge patch如下:
{ "title": "Hello!", "author": { "familyName": null }, "phoneNumber": "+01-123-456-7890", "tags": [ "example" ] } |
對於更改的應用方式需要一些解釋,但非常直觀:
- 存在帶有新值的“ title”表示需要更改標題。
- 姓氏的顯式“ null”表示應刪除該欄位。
- phoneNumber欄位表示需要新增新欄位。
- 更新的標籤表示需要修改標籤。
在Java中使用Json Patch
json-patch是一個很棒的Java庫,它同時支援Json Patch和Json Merge Patch。它與出色的Jackson庫整合,並在庫的頂部提供了補丁工具。該示例在kotlin中:
val s = """ { "title": "Goodbye!", "author": { "givenName": "John", "familyName": "Doe" }, "tags": [ "example", "sample" ], "content": "This will be unchanged" } """.trimIndent() val patch = """ [ { "op": "replace", "path": "/title", "value": "Hello!"}, { "op": "remove", "path": "/author/familyName"}, { "op": "add", "path": "/phoneNumber", "value": "+01-123-456-7890"}, { "op": "replace", "path": "/tags", "value": ["example"]} ] """.trimIndent() val jsonPatch: JsonPatch = JsonPatch.fromJson(objectMapper.readTree(patch)) val target = jsonPatch.apply(objectMapper.readTree(s)) |
在Java中使用Json Merge Patch
該庫使使用Json Merge補丁同樣容易:
val s = """ { "title": "Goodbye!", "author": { "givenName": "John", "familyName": "Doe" }, "tags": [ "example", "sample" ], "content": "This will be unchanged" } """.trimIndent() val patch = """ { "title": "Hello!", "author": { "familyName": null }, "phoneNumber": "+01-123-456-7890", "tags": ["example"] } """.trimIndent() val jsonMergePatch: JsonMergePatch = JsonMergePatch.fromJson(objectMapper.readTree(patch)) val target = jsonMergePatch.apply(objectMapper.readTree(s)) |
結論
Json Patch和Json Merge Patch是表示對JSON文件所做的更改的方法。兩種方法的執行方式略有不同,但都同樣直觀。
相關文章
- 字串值提取工具-09-java 執行 json 解析, json-path字串JavaJSON
- JSON簡介(java中的json庫使用)JSONJava
- java中json的使用方法JavaJSON
- Json-path學習筆記JSON筆記
- 什麼?修改 JSON 內容居然還有個 JSON PATCH 標準JSON
- js 中的json物件和mapJSON物件
- Android中實現JSON字串和JSON物件的轉換AndroidJSON字串物件
- java jsonJavaJSON
- 讓查詢可以使用 json pathJSON
- JQuery中ajax和JSON的獲取jQueryJSON
- java json和物件互相裝換JavaJSON物件
- json字串和json格式物件的轉換JSON字串物件
- Python3的json和PHP的jsonPythonJSONPHP
- Java 操作 JSONJavaJSON
- PHP中json_decode()和json_encode()的使用方法PHPJSON
- 第88節:Java中的Ajax和ASP.NET和TCP/IP 教程和JSONJavaASP.NETTCPJSON
- json陣列和json物件的包含關係JSON陣列物件
- JavaScript 中 structuredClone 和 JSON.parse(JSON.stringify()) 克隆物件的區別JavaScriptStructJSON物件
- JAVA獲取json中的全部鍵值對JavaJSON
- Flutter 中的 JSON 解析FlutterJSON
- JS中的JSON物件JSON物件
- JSON.parse()和JSON.stringify()JSON
- 【JSON】Python與Flask中涉及到的JSONJSONPythonFlask
- javascript ------->this 和jsonJavaScriptJSON
- Java map轉JSONJavaJSON
- java解析json listJavaJSON
- Java解析Json字串JavaJSON字串
- java生成json字串的方法JavaJSON字串
- Oracle EBS AD Merge PatchOracle
- python中json.dump() 和 json.dumps() 有那些區別?PythonJSON
- 淺析package.json中的devdependencies 和 dependenciesPackageJSONdev
- Json Schema簡介和Json Schema的.net實現庫 LateApexEarlySpeed.Json.SchemaJSON
- docker映象中json的作用DockerJSON
- action中json的應用JSON
- JSON.parse 和 JSON.stringify 詳解JSON
- XML和JSON的介紹XMLJSON
- JAVA 解析複雜的json字串JavaJSON字串
- ajax和json物件JSON物件