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 {
- }
- }
- }
JSONObject
- /*
- * 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);
- }
- }
- }
- }
JSONArray
一些数据转换的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树
点击上面可以查看生成的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()); } }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); }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即可,不过这里以单一条件的匹配,能正常实现也能应对需要匹配其他字段的情况
每个人的实现方式不同,这里仅是我个人的思路与实现,仅供参考。
新人一枚,如有疑问或建议,欢迎提出!