版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
两种方法,一种通用性高,一种性能好
实例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"}]}