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
- 什麼?修改 JSON 內容居然還有個 JSON PATCH 標準JSON
- java中json的使用方法JavaJSON
- java jsonJavaJSON
- 讓查詢可以使用 json pathJSON
- Python中字典和json的區別!PythonJSON
- JavaScript 中 structuredClone 和 JSON.parse(JSON.stringify()) 克隆物件的區別JavaScriptStructJSON物件
- 【JSON】Python與Flask中涉及到的JSONJSONPythonFlask
- Json Schema簡介和Json Schema的.net實現庫 LateApexEarlySpeed.Json.SchemaJSON
- 第88節:Java中的Ajax和ASP.NET和TCP/IP 教程和JSONJavaASP.NETTCPJSON
- java解析json listJavaJSON
- Java map轉JSONJavaJSON
- java生成json字串的方法JavaJSON字串
- JSON.parse 和 JSON.stringify 詳解JSON
- Flutter 中的 JSON 解析FlutterJSON
- Python教程:json中load和loads的區別PythonJSON
- 淺析package.json中的devdependencies 和 dependenciesPackageJSONdev
- JAVA 解析複雜的json字串JavaJSON字串
- 前端封裝成json資料和json陣列的方法前端封裝JSON陣列
- XML和JSON的介紹XMLJSON
- flutter json_annotation和json_serializable處理json資料序列化FlutterJSON
- JSON在Python中的使用JSONPython
- docker映象中json的作用DockerJSON
- JSON.parse()與JSON.stringify()的用法,以及eval()和new FunctionJSONFunction
- Java中將Excel轉換為JSON的兩種方法JavaExcelJSON
- java 如何簡單快速處理 json 中的資料JavaJSON
- json 物件與json 字串的區別。JSON物件字串
- java將物件轉為json的方式Java物件JSON
- Java XML和JSON:Java SE的文件處理,第1部分JavaXMLJSON
- Java XML和JSON:Java SE的文件處理 第2部分JavaXMLJSON
- JSON的特點和優勢JSON
- Java JSON組成和解析JavaJSON
- Json hijacking/Json劫持漏洞JSON
- JSON和pickle模組JSON
- Json和Map互轉,三個包(org.json/net.sf.json/com.google.gson)JSONGo
- 使用Jquery和JSON的州和城市列表jQueryJSON
- 使用@ResponseBody物件轉json和@RequestBody進行json轉物件案例物件JSON