Java Fastjson 替换指定属性 & JQ风格

Fastjson   是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

 

功能: 在不知道JSON格式的情况下,根据路径替换属性。

 

首先添加依赖,因为我们需要这个库。

     <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

添加一个测试工具类 JsonUtil

package cn.flkj.sshluciaextension.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * @author : 州长在手 2021/3/1 下午4:11
 */
public class JsonUtil {

    // --------------------------------- NO ARRAY ---------------------------------
//    public static <T> JSONObject JsonReplace(JSONObject json, String[] jsonPath, T content) {
//        return JsonReplaceHelper(json, jsonPath, content, 1);
//    }
//
//    public static <T> JSONObject JsonReplaceHelper(JSONObject json, String[] jsonPath, T content, int index) {
//        if (index == jsonPath.length) {
//            return json.fluentPut(jsonPath[index - 1], content);
//        }
//        JSONObject jsonSub = json.getJSONObject(jsonPath[index - 1]);
//        JSONObject jsonSubX = JsonReplaceHelper(jsonSub, jsonPath, content, index + 1);
//        json.fluentPut(jsonPath[index - 1], jsonSubX);
//        return json;
//    }

    // --------------------------------- ARRAY ---------------------------------
    public static <T> void JsonReplace(JSONObject json, String[] jsonPath, T content) {
         JsonReplaceHelper(json, jsonPath, content, 1);
    }

    public static <T> JSONObject JsonReplaceHelper(JSONObject json, String[] jsonPath, T content, int index) {
        String subPath = jsonPath[index - 1];
        // 递归结束状态,返回给上一次递归需要的数据
        if (index == jsonPath.length) {
            if (!subPath.contains("[")) {
                return json.fluentPut(jsonPath[index - 1], content);
            } else {
                int number = Integer.parseInt(subPath.substring(subPath.indexOf("[") + 1, subPath.indexOf("]")));
                String subPathX = subPath.substring(0, subPath.indexOf("["));
                JSONArray subArray = json.getJSONArray(subPathX);
                subArray.remove(number);
                subArray.fluentAdd(number, content);
                json.fluentPut(subPathX, subArray);
                return json;
            }
        }
        // 是否是数组
        if (!subPath.contains("[")) {
            JSONObject jsonSub = json.getJSONObject(subPath);
            JSONObject jsonSubX = JsonReplaceHelper(jsonSub, jsonPath, content, index + 1);
            json.fluentPut(subPath, jsonSubX);
            return json;
        } else {
            // 数组的第几个
            int number = Integer.parseInt(subPath.substring(subPath.indexOf("[") + 1, subPath.indexOf("]")));
            // 包含数组的真实键
            String subPathX = subPath.substring(0, subPath.indexOf("["));
            JSONArray subArray = json.getJSONArray(subPathX);
            JSONObject jsonSub = subArray.getJSONObject(number);
            JSONObject jsonSubX = JsonReplaceHelper(jsonSub, jsonPath, content, index + 1);
            subArray.remove(number);
            subArray.fluentAdd(number, jsonSubX);
            json.fluentPut(subPathX, subArray);
            return json;
        }
    }
}
package cn.flkj.sshluciaextension.utils;

import cn.flkj.sshluciaextension.shellcommand.ShellCommand;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.bouncycastle.math.ec.ScaleYNegateXPointMap;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

/**
 * @author : 州长在手 2021/3/1 下午4:15
 */
class JsonUtilTest {
    //
    @Test
    public void testJsonReplace(){
        String jsonStr = ShellCommand.readingFile("static/config.txt");
        // System.out.println(jsonStr);
        JSONObject json = JSON.parseObject(jsonStr);
        System.out.println("old: "+json);
     // 需要替换属性的路径; String rep
= "data.data[0].payload.data[1].config[0]";
// 替换的属性 String con
= "替换成功"; JsonUtil.JsonReplace(json,rep.split("\\."),con); System.out.println("new: "+json); } }

 

测试用例:

{
    "data":{
        "data":[
            {
                "payload":{
                    "data":[
                        {
                            "axss":"aaaaaa",
                            "config":[
                                "-----------------------"
                            ]
                        },
                        {
                            "axss":"aaaaaa",
                            "config":[
                                "需要替换"
                            ]
                        }
                    ]
                }
            },
            {
                "payload":{
                    "data":{
                        "axss":"aaaaaa",
                        "config":"xxxxx"
                    }
                }
            }
        ]
    }
}

 

 

测试截图:

 

posted @ 2021-03-02 10:46  州长在手  阅读(1155)  评论(1编辑  收藏  举报