Java 中 JSON 去除指定字段(对象中,数组中,List中)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/LitongZero/article/details/100259418

两种方法,一种通用性高,一种性能好

实例JSON

{
	"total": 1,
	"columnArray": ["name","sex","age"],
	"dataMap": {
		"name": "姓名",
		"sex": "性别",
		"age": "年龄"
	},
	"list": [{
		"name": "ltz",
		"sex": "男",
		"age": "18"
	}]
}

一、通用方法

此方法可以去除JSONObject中指定的属性,包括在对象中,数组中,以及List中。

使用FastJSON,其他的应该也可以。

由于通用性,所以改方法性能较差。不建议在并发数大的场景使用。

1.工具类代码


/**
     * JSON去除指定属性(属性值,数组中,对象中,List中)
     * @param jsonObject 需处理JSON
     * @param removeParams 去除属性名称
     * @return
     */
    public JSONObject jsonRemoveParams(JSONObject jsonObject, String removeParams){
        // 获取所有一级Key
        Set<String> keySet = jsonObject.keySet();
        // 通过一级Key遍历
        for (String key : keySet) {
            JSONArray jsonArray;
            try {
                // 将一级值转换为数组
                jsonArray = (JSONArray) jsonObject.get(key);
            } catch (Exception e) {
                // 转换失败,说明一级值不为数组
                try {
                    // 尝试将一级值转换为对象
                    JSONObject jsonObject1 = (JSONObject) jsonObject.get(key);
                    // 删除对象中属性
                    jsonObject1.remove(removeParams);
                } catch (Exception ex) {
                    // 转换失败,说明一级值为常量,循环结束
                    continue;
                }
                // 一级值不为数组,循环结束
                continue;
            }
            // 一级值为数组,遍历List行去除
            for (int i = 0; i < jsonArray.size(); i++) {
                try {
                    // 尝试直接去除List中的对象值
                    ((JSONObject) jsonArray.get(i)).remove(removeParams);
                } catch (Exception e) {
                    // 去除失败,说明此List为数组,进行数组去除值
                    jsonArray = (JSONArray) arrayDelete(removeParams, jsonArray);
                }
            }
        }
        return jsonObject;
    }
    
    
    /***
     * 删除数组中指定元素
     * @param removeParams 需要删除的元素
     * @param list  原始数组
     * @return
     */
    private static List arrayDelete(String removeParams, List list) {
        for (int i = 0; i < list.size(); i++) {
            if (removeParams.equals(list.get(i))) {
                list.remove(i);
            }
        }
        return list;
    }

2.去除后JSON

{
	"total": 1,
	"columnArray": ["name", "age"],
	"dataMap": {
		"name": "姓名",
		"age": "年龄"
	},
	"list": [{
		"name": "ltz",
		"age": "18"
	}]
}

二、需要传去除类型的方法(性能好)

由于第一种方法,嵌套循环的try catch导致性能过。

第二种方法则更精确,缺点是需要传去除类型。

1.这个枚举用不用都可以,也可以改为int判断。

public enum JsonTypeEnum {
    /**
     * JSON中数据类型
     */
    ATTRIBUTE(1,"属性"),
    ARRAY(2,"数组"),
    LIST(3,"列表"),
    OBJECT(4,"对象"),
    ;

    /**
     * 状态码
     */
    private Integer code;
    /**
     * 信息
     */
    private String msg;

    /**
     * 根据value返回枚举类型,主要在switch中使用
     * @param value
     * @return
     */
    public static JsonTypeEnum getByValue(int value) {
        for (JsonTypeEnum code : values()) {
            if (code.getCode() == value) {
                return code;
            }
        }
        return null;
    }
}

2.去除方法

/**
     * 去除JSON中指定属性
     * @param type 去除属性的位置
     * @param jsonObject 需要处理的JSON
     * @param removeParams 去除属性的坐标
     *                     如果是一级属性,只传一个字段
     *                     如果是其他类型属性,需要传前面的一级key
     * @return
     */
    public static JSONObject jsonRemoveParams(JsonTypeEnum type, JSONObject jsonObject, String... removeParams) {
        switch (type) {
            case ATTRIBUTE:
                // 普通属性,直接去除
                jsonObject.remove(removeParams[0]);
                return jsonObject;
            case ARRAY:
                // 数组 去除
                // 获取 二级对象(数组)
                JSONArray list = (JSONArray) jsonObject.get(removeParams[0]);
                for (int i = 0; i < list.size(); i++) {
                    if (removeParams[1].equals(list.get(i))) {
                        list.remove(i);
                    }
                }
                return jsonObject;
            case LIST:
                // List 去除
                // 获取 二级对象(List)
                JSONArray jsonArray = (JSONArray) jsonObject.get(removeParams[0]);
                for (int i = 0; i < jsonArray.size(); i++) {
                    // 去除List中的对象值
                    ((JSONObject) jsonArray.get(i)).remove(removeParams[1]);
                }
                return jsonObject;

            case OBJECT:
                // 对象去除
                JSONObject jsonObject1 = (JSONObject) jsonObject.get(removeParams[0]);
                jsonObject1.remove(removeParams[1]);
                return jsonObject;
            default:
                return null;
        }


    }

3.测试方法

/**
     * 测试方法
     * @param args
     */
    public static void main(String[] args) {
        String json = "{\n" +
                "\t\"total\": 1,\n" +
                "\t\"columnArray\": [\"name\",\"sex\",\"age\"],\n" +
                "\t\"dataMap\": {\n" +
                "\t\t\"name\": \"姓名\",\n" +
                "\t\t\"sex\": \"性别\",\n" +
                "\t\t\"age\": \"年龄\"\n" +
                "\t},\n" +
                "\t\"list\": [{\n" +
                "\t\t\"name\": \"ltz\",\n" +
                "\t\t\"sex\": \"男\",\n" +
                "\t\t\"age\": \"18\"\n" +
                "\t}]\n" +
                "}";
        JSONObject jsonObject1 = JSON.parseObject(json);
        JSONObject jsonObject2 = JSON.parseObject(json);
        JSONObject jsonObject3 = JSON.parseObject(json);
        JSONObject jsonObject4 = JSON.parseObject(json);
        String removeParams = "sex";

        System.out.println(jsonRemoveParams(JsonTypeEnum.ATTRIBUTE, jsonObject1, "list"));
        System.out.println(jsonRemoveParams(JsonTypeEnum.ARRAY, jsonObject2, "columnArray" , removeParams));
        System.out.println(jsonRemoveParams(JsonTypeEnum.LIST, jsonObject3, "list" ,removeParams));
        System.out.println(jsonRemoveParams(JsonTypeEnum.OBJECT, jsonObject4, "dataMap" ,removeParams));

    }

4.运行结果

{"total":1,"columnArray":["name","sex","age"],"dataMap":{"sex":"性别","name":"姓名","age":"年龄"}}
{"total":1,"columnArray":["name","age"],"dataMap":{"sex":"性别","name":"姓名","age":"年龄"},"list":[{"sex":"男","name":"ltz","age":"18"}]}
{"total":1,"columnArray":["name","sex","age"],"dataMap":{"sex":"性别","name":"姓名","age":"年龄"},"list":[{"name":"ltz","age":"18"}]}
{"total":1,"columnArray":["name","sex","age"],"dataMap":{"name":"姓名","age":"年龄"},"list":[{"sex":"男","name":"ltz","age":"18"}]}

猜你喜欢

转载自blog.csdn.net/LitongZero/article/details/100259418