zoukankan      html  css  js  c++  java
  • 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());
                    }
              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即可,不过这里以单一条件的匹配,能正常实现也能应对需要匹配其他字段的情况

    每个人的实现方式不同,这里仅是我个人的思路与实现,仅供参考。

    新人一枚,如有疑问或建议,欢迎提出!

  • 相关阅读:
    使用 ASP.NET Core MVC 创建 Web API(五)
    使用 ASP.NET Core MVC 创建 Web API(四)
    使用 ASP.NET Core MVC 创建 Web API(三)
    使用 ASP.NET Core MVC 创建 Web API(二)
    使用 ASP.NET Core MVC 创建 Web API(一)
    学习ASP.NET Core Razor 编程系列十九——分页
    学习ASP.NET Core Razor 编程系列十八——并发解决方案
    一个屌丝程序猿的人生(九十八)
    一个屌丝程序猿的人生(九十七)
    一个屌丝程序猿的人生(九十五)
  • 原文地址:https://www.cnblogs.com/it-taosir/p/9860829.html
Copyright © 2011-2022 走看看