文章目錄
- 1.工具類
- 2.依賴
- 3.sql
本文檔只是為了留檔方便以后工作運維,或者給同事分享文檔內容比較簡陋命令也不是特別全,不適合小白觀看,如有不懂可以私信,上班期間都是在得
背景:因為頻繁操作json嵌套數據 PostgreSQL得JSON操作記錄(本來還有一份MongoDB得,但是因為電腦卡死機文檔沒保存下來,氣的我已經摔鍵盤了,后續重新寫在進行補充)
1.工具類
package com.xhao.PostgreSQL;import com.alibaba.fastjson2.JSON;
import com.jayway.jsonpath.JsonPath;
import org.springframework.util.ObjectUtils;/*** @author XHao*/
public class JsonUtils {/*** 刪除Key** @param json 原json* @param path 鏈路*/public static Object processJsonDelete(Object json, String path) {return JsonPath.parse(JSON.parse(json.toString())).delete(path).json();}/*** 查詢value** @param json 原json* @param path 鏈路*/public static Object getJsonValue(Object json, String path) {return JsonPath.parse(JSON.parse(json.toString())).read(path).toString();}/*** 更新/添加Json** @param json 原json* @param path 鏈路* @param value key*/public static Object processJsonUpdate(Object json, String path, Object value) {return JsonPath.parse(JSON.parse(json.toString())).set(path, value).json();}/*** 獲取json路徑** @param path 路徑* @param key key* @return 新json路徑*/public static String getPath(String path, String key) {if (ObjectUtils.isEmpty(key)) {return getPath(path);} else if (key.matches("\\d+")) {return getPath(path) + "[" + key + "]";} else {return getPath(path) + "." + key;}}/*** 獲取json路徑** @param path 路徑* @return 新json路徑*/public static String getPath(String path) {String[] parts = path.split("-");StringBuilder jsonPath = new StringBuilder("$");for (String part : parts) {// 檢查是否是數組索引(數字)if (part.matches("\\d+")) {jsonPath.append("[").append(part).append("]");} else {jsonPath.append(".").append(part);}}return jsonPath.toString();}public static void main(String[] args) {String str = "option-series-0-emphasis-textStyle";String str1 = null;System.err.println(getPath(str, str1));System.err.println(getPath(str));}
}
2.依賴
<!-- Hibernate 類型擴展 --><dependency><groupId>com.vladmihalcea</groupId><artifactId>hibernate-types-52</artifactId><version>2.14.0</version></dependency><!-- JsonPath --><dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>2.7.0</version></dependency><!-- PostgreSQL 驅動 --><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId></dependency>
3.sql
//查詢
SELECT json->'option'->'xAxis'->0->>'show' AS show_value
FROM "public".test
WHERE id = 1;//修改
UPDATE "public".test
SET json = jsonb_set(json, '{option,xAxis,0,show}', '55555'::jsonb) -- 將數字55555轉換為jsonb類型
WHERE id = 1;UPDATE "public".test
SET json = jsonb_set(json, '{option,xAxis,0,show}', -- 指定路徑為 option -> xAxis -> 0 -> show'true'::jsonb, -- 新的值,直接使用數字類型轉換為 jsonbtrue) -- 如果路徑不存在,則創建該路徑
WHERE id = 1;//刪除keyUPDATE "public".test
SET json = jsonb_set(json, '{option,xAxis,0}', jsonb_strip_nulls(json->'option'->'xAxis'->0) - 'show') -- 刪除 show 鍵
WHERE id = 1;//添加
UPDATE "public".test
SET json = jsonb_set(json, '{option,xAxis,0,show}', -- 指定路徑為 option -> xAxis -> 0 -> showtrue::jsonb, -- 新的值,必須轉換為 jsonb 類型true) -- 如果路徑不存在,則創建該路徑
WHERE id = 1;
因為電腦卡死機導致調研文檔得MongoDB得demo沒了,我也很苦惱后續重新寫的話在更新
如果點贊多,評論多會更新詳細教程,待補充。