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即可,不过这里以单一条件的匹配,能正常实现也能应对需要匹配其他字段的情况

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

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

  • 相关阅读:
    未定义的标示符“RECT”,引入了windows.h头文件也没有用?
    解决Opencv高低版本不兼容问题
    在OpenCV2.2后的版本中没有CvvImage类的解决方法(及出现错误:IntelliSense: 未定义标识符 "CvvImage" )
    opencv中Mat与IplImage,CVMat类型之间转换
    opencv中VideoCapture和cvCapture有什么区别?
    2019-2020-1 20175302_20175314_20175316 实验三 并发程序
    2019-2020-1 20175314 《信息安全系统设计基础》第8周学习总结
    2019-2020-1 20175302_20175314_20175316 实验二 固件程序设计
    2019-2020-1 20175302_20175314_20175316 实验一 开发环境的熟悉
    *2019-2020-1 20175302_20175314_20175316 实验一 开发环境的熟悉*
  • 原文地址:https://www.cnblogs.com/it-taosir/p/9860829.html
Copyright © 2011-2022 走看看