JSON树节点的增删查改
最近了解到使用json字符串存到数据库的一种存储方式,取出来的json字符串可以进行相应的节点操作
故借此机会练习下递归,完成对json节点操作对应的工具类。
介绍一下我使用的依赖
<!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.49</version> </dependency>
主要使用JSONObject和JSONArray的API进行相关操作,这里附上这两个类的代码
/* * Copyright 1999-2017 Alibaba Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.fastjson; import static com.alibaba.fastjson.util.TypeUtils.castToBigDecimal; import static com.alibaba.fastjson.util.TypeUtils.castToBigInteger; import static com.alibaba.fastjson.util.TypeUtils.castToBoolean; import static com.alibaba.fastjson.util.TypeUtils.castToByte; import static com.alibaba.fastjson.util.TypeUtils.castToBytes; import static com.alibaba.fastjson.util.TypeUtils.castToDate; import static com.alibaba.fastjson.util.TypeUtils.castToDouble; import static com.alibaba.fastjson.util.TypeUtils.castToFloat; import static com.alibaba.fastjson.util.TypeUtils.castToInt; import static com.alibaba.fastjson.util.TypeUtils.castToLong; import static com.alibaba.fastjson.util.TypeUtils.castToShort; import static com.alibaba.fastjson.util.TypeUtils.castToSqlDate; import static com.alibaba.fastjson.util.TypeUtils.castToTimestamp; import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.util.TypeUtils; /** * @author wenshao[szujobs@hotmail.com] */ public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler { private static final long serialVersionUID = 1L; private static final int DEFAULT_INITIAL_CAPACITY = 16; private final Map<String, Object> map; public JSONObject(){ this(DEFAULT_INITIAL_CAPACITY, false); } public JSONObject(Map<String, Object> map){ if (map == null) { throw new IllegalArgumentException("map is null."); } this.map = map; } public JSONObject(boolean ordered){ this(DEFAULT_INITIAL_CAPACITY, ordered); } public JSONObject(int initialCapacity){ this(initialCapacity, false); } public JSONObject(int initialCapacity, boolean ordered){ if (ordered) { map = new LinkedHashMap<String, Object>(initialCapacity); } else { map = new HashMap<String, Object>(initialCapacity); } } public int size() { return map.size(); } public boolean isEmpty() { return map.isEmpty(); } public boolean containsKey(Object key) { return map.containsKey(key); } public boolean containsValue(Object value) { return map.containsValue(value); } public Object get(Object key) { Object val = map.get(key); if (val == null && key instanceof Number) { val = map.get(key.toString()); } return val; } public JSONObject getJSONObject(String key) { Object value = map.get(key); if (value instanceof JSONObject) { return (JSONObject) value; } if (value instanceof String) { return JSON.parseObject((String) value); } return (JSONObject) toJSON(value); } public JSONArray getJSONArray(String key) { Object value = map.get(key); if (value instanceof JSONArray) { return (JSONArray) value; } if (value instanceof String) { return (JSONArray) JSON.parse((String) value); } return (JSONArray) toJSON(value); } public <T> T getObject(String key, Class<T> clazz) { Object obj = map.get(key); return TypeUtils.castToJavaBean(obj, clazz); } public <T> T getObject(String key, Type type) { Object obj = map.get(key); return TypeUtils.cast(obj, type, ParserConfig.getGlobalInstance()); } public <T> T getObject(String key, TypeReference typeReference) { Object obj = map.get(key); if (typeReference == null) { return (T) obj; } return TypeUtils.cast(obj, typeReference.getType(), ParserConfig.getGlobalInstance()); } public Boolean getBoolean(String key) { Object value = get(key); if (value == null) { return null; } return castToBoolean(value); } public byte[] getBytes(String key) { Object value = get(key); if (value == null) { return null; } return castToBytes(value); } public boolean getBooleanValue(String key) { Object value = get(key); Boolean booleanVal = castToBoolean(value); if (booleanVal == null) { return false; } return booleanVal.booleanValue(); } public Byte getByte(String key) { Object value = get(key); return castToByte(value); } public byte getByteValue(String key) { Object value = get(key); Byte byteVal = castToByte(value); if (byteVal == null) { return 0; } return byteVal.byteValue(); } public Short getShort(String key) { Object value = get(key); return castToShort(value); } public short getShortValue(String key) { Object value = get(key); Short shortVal = castToShort(value); if (shortVal == null) { return 0; } return shortVal.shortValue(); } public Integer getInteger(String key) { Object value = get(key); return castToInt(value); } public int getIntValue(String key) { Object value = get(key); Integer intVal = castToInt(value); if (intVal == null) { return 0; } return intVal.intValue(); } public Long getLong(String key) { Object value = get(key); return castToLong(value); } public long getLongValue(String key) { Object value = get(key); Long longVal = castToLong(value); if (longVal == null) { return 0L; } return longVal.longValue(); } public Float getFloat(String key) { Object value = get(key); return castToFloat(value); } public float getFloatValue(String key) { Object value = get(key); Float floatValue = castToFloat(value); if (floatValue == null) { return 0F; } return floatValue.floatValue(); } public Double getDouble(String key) { Object value = get(key); return castToDouble(value); } public double getDoubleValue(String key) { Object value = get(key); Double doubleValue = castToDouble(value); if (doubleValue == null) { return 0D; } return doubleValue.doubleValue(); } public BigDecimal getBigDecimal(String key) { Object value = get(key); return castToBigDecimal(value); } public BigInteger getBigInteger(String key) { Object value = get(key); return castToBigInteger(value); } public String getString(String key) { Object value = get(key); if (value == null) { return null; } return value.toString(); } public Date getDate(String key) { Object value = get(key); return castToDate(value); } public java.sql.Date getSqlDate(String key) { Object value = get(key); return castToSqlDate(value); } public java.sql.Timestamp getTimestamp(String key) { Object value = get(key); return castToTimestamp(value); } public Object put(String key, Object value) { return map.put(key, value); } public JSONObject fluentPut(String key, Object value) { map.put(key, value); return this; } public void putAll(Map<? extends String, ? extends Object> m) { map.putAll(m); } public JSONObject fluentPutAll(Map<? extends String, ? extends Object> m) { map.putAll(m); return this; } public void clear() { map.clear(); } public JSONObject fluentClear() { map.clear(); return this; } public Object remove(Object key) { return map.remove(key); } public JSONObject fluentRemove(Object key) { map.remove(key); return this; } public Set<String> keySet() { return map.keySet(); } public Collection<Object> values() { return map.values(); } public Set<Map.Entry<String, Object>> entrySet() { return map.entrySet(); } @Override public Object clone() { return new JSONObject(map instanceof LinkedHashMap // ? new LinkedHashMap<String, Object>(map) // : new HashMap<String, Object>(map) ); } public boolean equals(Object obj) { return this.map.equals(obj); } public int hashCode() { return this.map.hashCode(); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Class<?>[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length == 1) { if (method.getName().equals("equals")) { return this.equals(args[0]); } Class<?> returnType = method.getReturnType(); if (returnType != void.class) { throw new JSONException("illegal setter"); } String name = null; JSONField annotation = method.getAnnotation(JSONField.class); if (annotation != null) { if (annotation.name().length() != 0) { name = annotation.name(); } } if (name == null) { name = method.getName(); if (!name.startsWith("set")) { throw new JSONException("illegal setter"); } name = name.substring(3); if (name.length() == 0) { throw new JSONException("illegal setter"); } name = Character.toLowerCase(name.charAt(0)) + name.substring(1); } map.put(name, args[0]); return null; } if (parameterTypes.length == 0) { Class<?> returnType = method.getReturnType(); if (returnType == void.class) { throw new JSONException("illegal getter"); } String name = null; JSONField annotation = method.getAnnotation(JSONField.class); if (annotation != null) { if (annotation.name().length() != 0) { name = annotation.name(); } } if (name == null) { name = method.getName(); if (name.startsWith("get")) { name = name.substring(3); if (name.length() == 0) { throw new JSONException("illegal getter"); } name = Character.toLowerCase(name.charAt(0)) + name.substring(1); } else if (name.startsWith("is")) { name = name.substring(2); if (name.length() == 0) { throw new JSONException("illegal getter"); } name = Character.toLowerCase(name.charAt(0)) + name.substring(1); } else if (name.startsWith("hashCode")) { return this.hashCode(); } else if (name.startsWith("toString")) { return this.toString(); } else { throw new JSONException("illegal getter"); } } Object value = map.get(name); return TypeUtils.cast(value, method.getGenericReturnType(), ParserConfig.getGlobalInstance()); } throw new UnsupportedOperationException(method.toGenericString()); } public Map<String, Object> getInnerMap() { return this.map; } private void readObject(final java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { SecureObjectInputStream.ensureFields(); if (SecureObjectInputStream.fields != null && !SecureObjectInputStream.fields_error) { ObjectInputStream secIn = new SecureObjectInputStream(in); secIn.defaultReadObject(); return; } in.defaultReadObject(); for (Entry entry : map.entrySet()) { final Object key = entry.getKey(); if (key != null) { ParserConfig.global.checkAutoType(key.getClass().getName(), null); } final Object value = entry.getValue(); if (value != null) { ParserConfig.global.checkAutoType(value.getClass().getName(), null); } } } static class SecureObjectInputStream extends ObjectInputStream { static Field[] fields; static volatile boolean fields_error; static void ensureFields() { if (fields == null && !fields_error) { try { final Field[] declaredFields = ObjectInputStream.class.getDeclaredFields(); String[] fieldnames = new String[]{"bin", "passHandle", "handles", "curContext"}; Field[] array = new Field[fieldnames.length]; for (int i = 0; i < fieldnames.length; i++) { Field field = TypeUtils .getField(ObjectInputStream.class , fieldnames[i] , declaredFields ); field.setAccessible(true); array[i] = field; } fields = array; } catch (Throwable error) { fields_error = true; } } } public SecureObjectInputStream(ObjectInputStream in) throws IOException { super(in); try { for (int i = 0; i < fields.length; i++) { final Field field = fields[i]; final Object value = field.get(in); field.set(this, value); } } catch (IllegalAccessException e) { fields_error = true; } } protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { String name = desc.getName(); ParserConfig.global.checkAutoType(name, null); return super.resolveClass(desc); } protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException { for (String interfacename : interfaces) { //检查是否处于黑名单 ParserConfig.global.checkAutoType(interfacename, null); } return super.resolveProxyClass(interfaces); } //Hack:默认构造方法会调用这个方法,重写此方法使用反射还原部分关键属性 protected void readStreamHeader() throws IOException, StreamCorruptedException { } } }
/* * Copyright 1999-2017 Alibaba Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.fastjson; import static com.alibaba.fastjson.util.TypeUtils.castToBigDecimal; import static com.alibaba.fastjson.util.TypeUtils.castToBigInteger; import static com.alibaba.fastjson.util.TypeUtils.castToBoolean; import static com.alibaba.fastjson.util.TypeUtils.castToByte; import static com.alibaba.fastjson.util.TypeUtils.castToDate; import static com.alibaba.fastjson.util.TypeUtils.castToDouble; import static com.alibaba.fastjson.util.TypeUtils.castToFloat; import static com.alibaba.fastjson.util.TypeUtils.castToInt; import static com.alibaba.fastjson.util.TypeUtils.castToLong; import static com.alibaba.fastjson.util.TypeUtils.castToShort; import static com.alibaba.fastjson.util.TypeUtils.castToSqlDate; import static com.alibaba.fastjson.util.TypeUtils.castToString; import static com.alibaba.fastjson.util.TypeUtils.castToTimestamp; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; import java.lang.reflect.Type; import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; import com.alibaba.fastjson.util.TypeUtils; /** * @author wenshao[szujobs@hotmail.com] */ public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable { private static final long serialVersionUID = 1L; private final List<Object> list; protected transient Object relatedArray; protected transient Type componentType; public JSONArray(){ this.list = new ArrayList<Object>(); } public JSONArray(List<Object> list){ this.list = list; } public JSONArray(int initialCapacity){ this.list = new ArrayList<Object>(initialCapacity); } /** * @since 1.1.16 * @return */ public Object getRelatedArray() { return relatedArray; } public void setRelatedArray(Object relatedArray) { this.relatedArray = relatedArray; } public Type getComponentType() { return componentType; } public void setComponentType(Type componentType) { this.componentType = componentType; } public int size() { return list.size(); } public boolean isEmpty() { return list.isEmpty(); } public boolean contains(Object o) { return list.contains(o); } public Iterator<Object> iterator() { return list.iterator(); } public Object[] toArray() { return list.toArray(); } public <T> T[] toArray(T[] a) { return list.toArray(a); } public boolean add(Object e) { return list.add(e); } public JSONArray fluentAdd(Object e) { list.add(e); return this; } public boolean remove(Object o) { return list.remove(o); } public JSONArray fluentRemove(Object o) { list.remove(o); return this; } public boolean containsAll(Collection<?> c) { return list.containsAll(c); } public boolean addAll(Collection<? extends Object> c) { return list.addAll(c); } public JSONArray fluentAddAll(Collection<? extends Object> c) { list.addAll(c); return this; } public boolean addAll(int index, Collection<? extends Object> c) { return list.addAll(index, c); } public JSONArray fluentAddAll(int index, Collection<? extends Object> c) { list.addAll(index, c); return this; } public boolean removeAll(Collection<?> c) { return list.removeAll(c); } public JSONArray fluentRemoveAll(Collection<?> c) { list.removeAll(c); return this; } public boolean retainAll(Collection<?> c) { return list.retainAll(c); } public JSONArray fluentRetainAll(Collection<?> c) { list.retainAll(c); return this; } public void clear() { list.clear(); } public JSONArray fluentClear() { list.clear(); return this; } public Object set(int index, Object element) { if (index == -1) { list.add(element); return null; } if (list.size() <= index) { for (int i = list.size(); i < index; ++i) { list.add(null); } list.add(element); return null; } return list.set(index, element); } public JSONArray fluentSet(int index, Object element) { set(index, element); return this; } public void add(int index, Object element) { list.add(index, element); } public JSONArray fluentAdd(int index, Object element) { list.add(index, element); return this; } public Object remove(int index) { return list.remove(index); } public JSONArray fluentRemove(int index) { list.remove(index); return this; } public int indexOf(Object o) { return list.indexOf(o); } public int lastIndexOf(Object o) { return list.lastIndexOf(o); } public ListIterator<Object> listIterator() { return list.listIterator(); } public ListIterator<Object> listIterator(int index) { return list.listIterator(index); } public List<Object> subList(int fromIndex, int toIndex) { return list.subList(fromIndex, toIndex); } public Object get(int index) { return list.get(index); } public JSONObject getJSONObject(int index) { Object value = list.get(index); if (value instanceof JSONObject) { return (JSONObject) value; } return (JSONObject) toJSON(value); } public JSONArray getJSONArray(int index) { Object value = list.get(index); if (value instanceof JSONArray) { return (JSONArray) value; } return (JSONArray) toJSON(value); } public <T> T getObject(int index, Class<T> clazz) { Object obj = list.get(index); return TypeUtils.castToJavaBean(obj, clazz); } public <T> T getObject(int index, Type type) { Object obj = list.get(index); if (type instanceof Class) { return (T) TypeUtils.castToJavaBean(obj, (Class) type); } else { String json = JSON.toJSONString(obj); return (T) JSON.parseObject(json, type); } } public Boolean getBoolean(int index) { Object value = get(index); if (value == null) { return null; } return castToBoolean(value); } public boolean getBooleanValue(int index) { Object value = get(index); if (value == null) { return false; } return castToBoolean(value).booleanValue(); } public Byte getByte(int index) { Object value = get(index); return castToByte(value); } public byte getByteValue(int index) { Object value = get(index); if (value == null) { return 0; } return castToByte(value).byteValue(); } public Short getShort(int index) { Object value = get(index); return castToShort(value); } public short getShortValue(int index) { Object value = get(index); if (value == null) { return 0; } return castToShort(value).shortValue(); } public Integer getInteger(int index) { Object value = get(index); return castToInt(value); } public int getIntValue(int index) { Object value = get(index); if (value == null) { return 0; } return castToInt(value).intValue(); } public Long getLong(int index) { Object value = get(index); return castToLong(value); } public long getLongValue(int index) { Object value = get(index); if (value == null) { return 0L; } return castToLong(value).longValue(); } public Float getFloat(int index) { Object value = get(index); return castToFloat(value); } public float getFloatValue(int index) { Object value = get(index); if (value == null) { return 0F; } return castToFloat(value).floatValue(); } public Double getDouble(int index) { Object value = get(index); return castToDouble(value); } public double getDoubleValue(int index) { Object value = get(index); if (value == null) { return 0D; } return castToDouble(value); } public BigDecimal getBigDecimal(int index) { Object value = get(index); return castToBigDecimal(value); } public BigInteger getBigInteger(int index) { Object value = get(index); return castToBigInteger(value); } public String getString(int index) { Object value = get(index); return castToString(value); } public java.util.Date getDate(int index) { Object value = get(index); return castToDate(value); } public java.sql.Date getSqlDate(int index) { Object value = get(index); return castToSqlDate(value); } public java.sql.Timestamp getTimestamp(int index) { Object value = get(index); return castToTimestamp(value); } /** * @since 1.2.23 */ public <T> List<T> toJavaList(Class<T> clazz) { List<T> list = new ArrayList<T>(this.size()); ParserConfig config = ParserConfig.getGlobalInstance(); for (Object item : this) { T classItem = (T) TypeUtils.cast(item, clazz, config); list.add(classItem); } return list; } @Override public Object clone() { return new JSONArray(new ArrayList<Object>(list)); } public boolean equals(Object obj) { return this.list.equals(obj); } public int hashCode() { return this.list.hashCode(); } private void readObject(final java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { JSONObject.SecureObjectInputStream.ensureFields(); if (JSONObject.SecureObjectInputStream.fields != null && !JSONObject.SecureObjectInputStream.fields_error) { ObjectInputStream secIn = new JSONObject.SecureObjectInputStream(in); secIn.defaultReadObject(); return; } in.defaultReadObject(); for (Object item : list) { if (item != null) { ParserConfig.global.checkAutoType(item.getClass().getName(), null); } } } }
一些数据转换的API
JSONArray.parseArray("json树字符串")-----------可以返回JSONArray对象
jsonArray对象.toJSONString()------------------------可以转换为字符串便于存入数据库
首先我们需要有一个json树,这里可以自己编写,跟数据库操作的相关方法暂不涉及,这里直接使用相关API搭建,在main方法中
public static void main(String[] args) { JSONArray details=new JSONArray(); JSONObject tree1=new JSONObject(); tree1.put("id",1); tree1.put("code", "taosir"); tree1.put("name", "taosir"); JSONObject tree2=new JSONObject(); tree2.put("id",2); tree2.put("code", "moer"); tree2.put("name", "moer"); JSONArray array1=new JSONArray(); array1.add(tree1); array1.add(tree2); JSONObject tree3=new JSONObject(); tree3.put("id",3); tree3.put("code", "xixi"); tree3.put("name", "xixi"); tree3.put("children", array1); JSONObject tree4=new JSONObject(); tree4.put("id",4); tree4.put("code", "jack"); tree4.put("name", "jack"); JSONArray array2=new JSONArray(); array2.add(tree3); array2.add(tree4); JSONObject tree5=new JSONObject(); tree5.put("id",5); tree5.put("code", "lay"); tree5.put("name", "lay"); tree5.put("children", array2); JSONObject tree6=new JSONObject(); tree6.put("id",6); tree6.put("code", "haer"); tree6.put("name", "haer"); details.add(tree5); details.add(tree6); System.out.println(details); }
[{ "id":5, "code":"lay", "name":"lay", "children":[{ "id":3, "code":"xixi", "name":"xixi", "children":[{ "code":"taosir", "name":"taosir", "id":1 },{ "code":"moer", "name":"moer", "id":2 }] },{ "id":4 "code":"jack", "name":"jack" }] },{ "code":"haer", "name":"haer", "id":6 }]
点击上面可以查看生成的json树
OK,准备工作完毕,下面进行功能演示。
(注意,每演示一个功能点,请注释掉其他的打印语句)
首先是查询:
/** * 根据单一条件获取节点位置 * @param body 查询目标的主体内容 * @param key 筛选匹配条件条件对应--key * @param value 筛选匹配条件对应--value * @param result 缓存查询结果 * @return */ public static JSONObject getNode(JSONArray body,String key,Object value,JSONObject result) { for (int i = 0; i < body.size(); i++) { JSONObject jsonObject =body.getJSONObject(i); if (jsonObject.get(key).toString().equals(value.toString())) { for (Map.Entry<String, Object> entry : jsonObject.entrySet()) { result.put(entry.getKey(), entry.getValue()); }
break; }else if(jsonObject.getJSONArray("children")!=null) { getNode(jsonObject.getJSONArray("children"), key, value,result); } } return result; }
在main方法调用演示,将前面的打印注释掉
//System.out.println(details); System.out.println(getNode(details, "id", 4,new JSONObject()));
查询写出来,基本思路对了,其他的操作都类似,简单得多
下面是添加
/** * * @param body 需要添加的目标树主体 * @param key 筛选匹配条件对应的key * @param value 筛选匹配条件的值 * @param index 需要插入的下标位置索引 * @param node 插入的整体节点 */ public static void addNode(JSONArray body,String key,Object value,int index,JSONObject node) { for (int i = 0; i < body.size(); i++) { if("id".equals(key)&&"0".equals(value.toString())) { body.add(index, node); break; } JSONObject jsonObject =body.getJSONObject(i); if (jsonObject.get(key).toString().equals(value.toString())) { jsonObject.getJSONArray("children").add(index, node);
break; }else if(jsonObject.getJSONArray("children")!=null) { addNode(jsonObject.getJSONArray("children"), key, value,index,node); } } }
System.out.println(getNode(details, "id",6 ,new JSONObject())); JSONObject tree7=new JSONObject(); tree7.put("id",7); tree7.put("code", "bom"); tree7.put("name", "bom"); addNode(details, "id", 6, 0, tree7); System.out.println(getNode(details, "id",6 ,new JSONObject()));
可以看到,当节点位置没有子节点时,默认追加,这个时候需要传0,没有考虑越界,可以弄自定义异常处理
System.out.println(getNode(details, "id",6 ,new JSONObject())); JSONObject tree8=new JSONObject(); tree8.put("id",8); tree8.put("code", "naonao"); tree8.put("name", "naonao"); addNode(details, "id", 6, 0, tree8); System.out.println(getNode(details, "id",6 ,new JSONObject()));
这种是已经有节点的情况,可以看到为直接插入索引位置
下面是删除,不保留孩子节点:
/** * 根据单一条件删除节点 * @param body 需要删除的目标主体 * @param key 筛选匹配条件对应的key * @param value 筛选匹配条件对应的value */ public static void delNode(JSONArray body,String key,Object value) { for (int i = 0; i < body.size(); i++) { JSONObject jsonObject =body.getJSONObject(i); if (jsonObject.get(key).toString().equals(value.toString())) { body.remove(i); break; }else if(jsonObject.getJSONArray("children")!=null) { delNode(jsonObject.getJSONArray("children"), key, value); } } }
System.out.println(getNode(details, "id",6 ,new JSONObject())); delNode(details, "id", 8); System.out.println(getNode(details, "id",6 ,new JSONObject()));
可以看到刚才加入的节点(id=8)已经被成功删除
下面是修改,可以选择是否保留孩子节点
/** * 根据单一条件修改节点 * @param body 需要修改的目标主体 * @param key 筛选匹配条件对应的key * @param value 筛选匹配条件对应的value * @param result 修改节点信息 * @param isKeep 是否保留孩子节点 */ public static void updateNode(JSONArray body,String key,Object value,JSONObject result,boolean isKeep) { for (int i = 0; i < body.size(); i++) { JSONObject jsonObject =body.getJSONObject(i); if (jsonObject.get(key).toString().equals(value.toString())) { if(isKeep) result.put("children", jsonObject.getJSONArray("children")); body.set(i, result); break; }else if(jsonObject.getJSONArray("children")!=null) { updateNode(jsonObject.getJSONArray("children"), key, value,result,isKeep); } } }
当需要保留孩子节点时:
System.out.println(getNode(details, "id",6 ,new JSONObject())); JSONObject tree9=new JSONObject(); tree9.put("id",6); tree9.put("code", "bom"); tree9.put("name", "bom"); updateNode(details, "id", 6, tree9, true); System.out.println(getNode(details, "id",6 ,new JSONObject()));
当不需要保留孩子节点时:
System.out.println(getNode(details, "id",6 ,new JSONObject())); JSONObject tree9=new JSONObject(); tree9.put("id",6); tree9.put("code", "bom"); tree9.put("name", "bom"); updateNode(details, "id", 6, tree9, false); System.out.println(getNode(details, "id",6 ,new JSONObject()));
以上,为简单的增删查改,根据业务不同会有不同的更改。
虽然业务要求匹配ID即可,不过这里以单一条件的匹配,能正常实现也能应对需要匹配其他字段的情况
每个人的实现方式不同,这里仅是我个人的思路与实现,仅供参考。
新人一枚,如有疑问或建议,欢迎提出!
作者:涛先森の日常
出处:https://www.cnblogs.com/it-taosir/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。