throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number.");

JSONObject.get***  null的话回报JSONException,大家注意下,附以下源码,正常try catch处理即可!!


package net.sf.json;

import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.Writer;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import net.sf.ezmorph.Morpher;
import net.sf.ezmorph.MorpherRegistry;
import net.sf.ezmorph.array.ObjectArrayMorpher;
import net.sf.ezmorph.bean.BeanMorpher;
import net.sf.ezmorph.object.IdentityObjectMorpher;
import net.sf.json.processors.DefaultValueProcessor;
import net.sf.json.processors.JsonBeanProcessor;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.processors.JsonVerifier;
import net.sf.json.processors.PropertyNameProcessor;
import net.sf.json.regexp.RegexpMatcher;
import net.sf.json.regexp.RegexpUtils;
import net.sf.json.util.CycleDetectionStrategy;
import net.sf.json.util.EnumMorpher;
import net.sf.json.util.JSONTokener;
import net.sf.json.util.JSONUtils;
import net.sf.json.util.NewBeanInstanceStrategy;
import net.sf.json.util.PropertyFilter;
import net.sf.json.util.PropertySetStrategy;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.DynaClass;
import org.apache.commons.beanutils.DynaProperty;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.collections.map.ListOrderedMap;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public final class JSONObject extends AbstractJSON
  implements JSON, Map, Comparable
{
  private static final Log log = LogFactory.getLog(JSONObject.class);
  private boolean nullObject;
  private Map properties;

  public static JSONObject fromObject(Object object)
  {
    return fromObject(object, new JsonConfig());
  }

  public static JSONObject fromObject(Object object, JsonConfig jsonConfig)
  {
    if ((object == null) || (JSONUtils.isNull(object)))
      return new JSONObject(true);
    if ((object instanceof Enum))
      throw new JSONException("'object' is an Enum. Use JSONArray instead");
    if (((object instanceof Annotation)) || ((object != null) && (object.getClass().isAnnotation())))
    {
      throw new JSONException("'object' is an Annotation.");
    }if ((object instanceof JSONObject))
      return _fromJSONObject((JSONObject)object, jsonConfig);
    if ((object instanceof DynaBean))
      return _fromDynaBean((DynaBean)object, jsonConfig);
    if ((object instanceof JSONTokener))
      return _fromJSONTokener((JSONTokener)object, jsonConfig);
    if ((object instanceof JSONString))
      return _fromJSONString((JSONString)object, jsonConfig);
    if ((object instanceof Map))
      return _fromMap((Map)object, jsonConfig);
    if ((object instanceof String))
      return _fromString((String)object, jsonConfig);
    if ((JSONUtils.isNumber(object)) || (JSONUtils.isBoolean(object)) || (JSONUtils.isString(object)))
    {
      return new JSONObject();
    }if (JSONUtils.isArray(object)) {
      throw new JSONException("'object' is an array. Use JSONArray instead");
    }
    return _fromBean(object, jsonConfig);
  }

  public static Object toBean(JSONObject jsonObject)
  {
    if ((jsonObject == null) || (jsonObject.isNullObject())) {
      return null;
    }

    DynaBean dynaBean = null;

    JsonConfig jsonConfig = new JsonConfig();
    Map props = JSONUtils.getProperties(jsonObject);
    dynaBean = JSONUtils.newDynaBean(jsonObject, jsonConfig);
    Iterator entries = jsonObject.names(jsonConfig).iterator();
    while (entries.hasNext()) {
      String name = (String)entries.next();
      String key = JSONUtils.convertToJavaIdentifier(name, jsonConfig);
      Class type = (Class)props.get(name);
      Object value = jsonObject.get(name);
      try {
        if (!JSONUtils.isNull(value)) {
          if ((value instanceof JSONArray))
            dynaBean.set(key, JSONArray.toCollection((JSONArray)value));
          else if ((String.class.isAssignableFrom(type)) || (Boolean.class.isAssignableFrom(type)) || (JSONUtils.isNumber(type)) || (Character.class.isAssignableFrom(type)) || (JSONFunction.class.isAssignableFrom(type)))
          {
            dynaBean.set(key, value);
          }
          else dynaBean.set(key, toBean((JSONObject)value));

        }
        else if (type.isPrimitive())
        {
          log.warn("Tried to assign null value to " + key + ":" + type.getName());
          dynaBean.set(key, JSONUtils.getMorpherRegistry().morph(type, null));
        }
        else {
          dynaBean.set(key, null);
        }
      }
      catch (JSONException jsone) {
        throw jsone;
      } catch (Exception e) {
        throw new JSONException("Error while setting property=" + name + " type" + type, e);
      }
    }

    return dynaBean;
  }

  public static Object toBean(JSONObject jsonObject, Class beanClass)
  {
    JsonConfig jsonConfig = new JsonConfig();
    jsonConfig.setRootClass(beanClass);
    return toBean(jsonObject, jsonConfig);
  }

  public static Object toBean(JSONObject jsonObject, Class beanClass, Map classMap)
  {
    JsonConfig jsonConfig = new JsonConfig();
    jsonConfig.setRootClass(beanClass);
    jsonConfig.setClassMap(classMap);
    return toBean(jsonObject, jsonConfig);
  }

  public static Object toBean(JSONObject jsonObject, JsonConfig jsonConfig)
  {
    if ((jsonObject == null) || (jsonObject.isNullObject())) {
      return null;
    }

    Class beanClass = jsonConfig.getRootClass();
    Map classMap = jsonConfig.getClassMap();

    if (beanClass == null) {
      return toBean(jsonObject);
    }
    if (classMap == null) {
      classMap = Collections.EMPTY_MAP;
    }

    Object bean = null;
    try {
      if (beanClass.isInterface()) {
        if (!Map.class.isAssignableFrom(beanClass)) {
          throw new JSONException("beanClass is an interface. " + beanClass);
        }
        bean = new HashMap();
      }
      else {
        bean = jsonConfig.getNewBeanInstanceStrategy().newInstance(beanClass, jsonObject);
      }
    }
    catch (JSONException jsone) {
      throw jsone;
    } catch (Exception e) {
      throw new JSONException(e);
    }

    Map props = JSONUtils.getProperties(jsonObject);
    PropertyFilter javaPropertyFilter = jsonConfig.getJavaPropertyFilter();
    Iterator entries = jsonObject.names(jsonConfig).iterator();
    while (entries.hasNext()) {
      String name = (String)entries.next();
      Class type = (Class)props.get(name);
      Object value = jsonObject.get(name);
      if ((javaPropertyFilter != null) && (javaPropertyFilter.apply(bean, name, value))) {
        continue;
      }
      String key = (Map.class.isAssignableFrom(beanClass)) && (jsonConfig.isSkipJavaIdentifierTransformationInMapKeys()) ? name : JSONUtils.convertToJavaIdentifier(name, jsonConfig);

      PropertyNameProcessor propertyNameProcessor = jsonConfig.findJavaPropertyNameProcessor(beanClass);
      if (propertyNameProcessor != null)
        key = propertyNameProcessor.processPropertyName(beanClass, key);
      try
      {
        if (Map.class.isAssignableFrom(beanClass))
        {
          if (JSONUtils.isNull(value)) {
            setProperty(bean, key, value, jsonConfig);
          } else if ((value instanceof JSONArray)) {
            setProperty(bean, key, convertPropertyValueToCollection(key, value, jsonConfig, name, classMap, List.class), jsonConfig);
          }
          else if ((String.class.isAssignableFrom(type)) || (JSONUtils.isBoolean(type)) || (JSONUtils.isNumber(type)) || (JSONUtils.isString(type)) || (JSONFunction.class.isAssignableFrom(type)))
          {
            if ((jsonConfig.isHandleJettisonEmptyElement()) && ("".equals(value)))
              setProperty(bean, key, null, jsonConfig);
            else
              setProperty(bean, key, value, jsonConfig);
          }
          else {
            Class targetClass = findTargetClass(key, classMap);
            targetClass = targetClass == null ? findTargetClass(name, classMap) : targetClass;

            JsonConfig jsc = jsonConfig.copy();
            jsc.setRootClass(targetClass);
            jsc.setClassMap(classMap);
            if (targetClass != null)
              setProperty(bean, key, toBean((JSONObject)value, jsc), jsonConfig);
            else
              setProperty(bean, key, toBean((JSONObject)value), jsonConfig);
          }
        }
        else {
          PropertyDescriptor pd = PropertyUtils.getPropertyDescriptor(bean, key);
          if ((pd != null) && (pd.getWriteMethod() == null)) {
            log.info("Property '" + key + "' of " + bean.getClass() + " has no write method. SKIPPED.");
            continue;
          }

          if (pd != null) {
            Class targetType = pd.getPropertyType();
            if (!JSONUtils.isNull(value)) {
              if ((value instanceof JSONArray)) {
                if (List.class.isAssignableFrom(pd.getPropertyType())) {
                  setProperty(bean, key, convertPropertyValueToCollection(key, value, jsonConfig, name, classMap, pd.getPropertyType()), jsonConfig);
                }
                else if (Set.class.isAssignableFrom(pd.getPropertyType())) {
                  setProperty(bean, key, convertPropertyValueToCollection(key, value, jsonConfig, name, classMap, pd.getPropertyType()), jsonConfig);
                }
                else {
                  setProperty(bean, key, convertPropertyValueToArray(key, value, targetType, jsonConfig, classMap), jsonConfig);
                }
              }
              else if ((String.class.isAssignableFrom(type)) || (JSONUtils.isBoolean(type)) || (JSONUtils.isNumber(type)) || (JSONUtils.isString(type)) || (JSONFunction.class.isAssignableFrom(type)))
              {
                if (pd != null) {
                  if ((jsonConfig.isHandleJettisonEmptyElement()) && ("".equals(value)))
                    setProperty(bean, key, null, jsonConfig);
                  else if (!targetType.isInstance(value)) {
                    setProperty(bean, key, morphPropertyValue(key, value, type, targetType), jsonConfig);
                  }
                  else
                    setProperty(bean, key, value, jsonConfig);
                }
                else if ((beanClass == null) || ((bean instanceof Map)))
                  setProperty(bean, key, value, jsonConfig);
                else {
                  log.warn("Tried to assign property " + key + ":" + type.getName() + " to bean of class " + bean.getClass().getName());
                }

              }
              else if (jsonConfig.isHandleJettisonSingleElementArray()) {
                JSONArray array = new JSONArray().element(value, jsonConfig);
                Class newTargetClass = findTargetClass(key, classMap);
                newTargetClass = newTargetClass == null ? findTargetClass(name, classMap) : newTargetClass;

                JsonConfig jsc = jsonConfig.copy();
                jsc.setRootClass(newTargetClass);
                jsc.setClassMap(classMap);
                if (targetType.isArray()) {
                  setProperty(bean, key, JSONArray.toArray(array, jsc), jsonConfig);
                } else if (JSONArray.class.isAssignableFrom(targetType)) {
                  setProperty(bean, key, array, jsonConfig);
                } else if ((List.class.isAssignableFrom(targetType)) || (Set.class.isAssignableFrom(targetType)))
                {
                  jsc.setCollectionType(targetType);
                  setProperty(bean, key, JSONArray.toCollection(array, jsc), jsonConfig);
                }
                else {
                  setProperty(bean, key, toBean((JSONObject)value, jsc), jsonConfig);
                }
              } else {
                if ((targetType == Object.class) || (targetType.isInterface())) {
                  Class targetTypeCopy = targetType;
                  targetType = findTargetClass(key, classMap);
                  targetType = targetType == null ? findTargetClass(name, classMap) : targetType;

                  targetType = (targetType == null) && (targetTypeCopy.isInterface()) ? targetTypeCopy : targetType;
                }

                JsonConfig jsc = jsonConfig.copy();
                jsc.setRootClass(targetType);
                jsc.setClassMap(classMap);
                setProperty(bean, key, toBean((JSONObject)value, jsc), jsonConfig);
              }

            }
            else if (type.isPrimitive())
            {
              log.warn("Tried to assign null value to " + key + ":" + type.getName());
              setProperty(bean, key, JSONUtils.getMorpherRegistry().morph(type, null), jsonConfig);
            }
            else {
              setProperty(bean, key, null, jsonConfig);
            }

          }
          else if (!JSONUtils.isNull(value)) {
            if ((value instanceof JSONArray)) {
              setProperty(bean, key, convertPropertyValueToCollection(key, value, jsonConfig, name, classMap, List.class), jsonConfig);
            }
            else if ((String.class.isAssignableFrom(type)) || (JSONUtils.isBoolean(type)) || (JSONUtils.isNumber(type)) || (JSONUtils.isString(type)) || (JSONFunction.class.isAssignableFrom(type)))
            {
              if ((beanClass == null) || ((bean instanceof Map)) || (jsonConfig.getPropertySetStrategy() != null) || (!jsonConfig.isIgnorePublicFields()))
              {
                setProperty(bean, key, value, jsonConfig);
              }
              else log.warn("Tried to assign property " + key + ":" + type.getName() + " to bean of class " + bean.getClass().getName());

            }
            else if (jsonConfig.isHandleJettisonSingleElementArray()) {
              Class newTargetClass = findTargetClass(key, classMap);
              newTargetClass = newTargetClass == null ? findTargetClass(name, classMap) : newTargetClass;

              JsonConfig jsc = jsonConfig.copy();
              jsc.setRootClass(newTargetClass);
              jsc.setClassMap(classMap);
              setProperty(bean, key, toBean((JSONObject)value, jsc), jsonConfig);
            } else {
              setProperty(bean, key, value, jsonConfig);
            }

          }
          else if (type.isPrimitive())
          {
            log.warn("Tried to assign null value to " + key + ":" + type.getName());
            setProperty(bean, key, JSONUtils.getMorpherRegistry().morph(type, null), jsonConfig);
          }
          else {
            setProperty(bean, key, null, jsonConfig);
          }
        }
      }
      catch (JSONException jsone)
      {
        throw jsone;
      } catch (Exception e) {
        throw new JSONException("Error while setting property=" + name + " type " + type, e);
      }
    }

    return bean;
  }

  public static Object toBean(JSONObject jsonObject, Object root, JsonConfig jsonConfig)
  {
    if ((jsonObject == null) || (jsonObject.isNullObject()) || (root == null)) {
      return root;
    }

    Class rootClass = root.getClass();
    if (rootClass.isInterface()) {
      throw new JSONException("Root bean is an interface. " + rootClass);
    }

    Map classMap = jsonConfig.getClassMap();
    if (classMap == null) {
      classMap = Collections.EMPTY_MAP;
    }

    Map props = JSONUtils.getProperties(jsonObject);
    PropertyFilter javaPropertyFilter = jsonConfig.getJavaPropertyFilter();
    Iterator entries = jsonObject.names(jsonConfig).iterator();
    while (entries.hasNext()) {
      String name = (String)entries.next();
      Class type = (Class)props.get(name);
      Object value = jsonObject.get(name);
      if ((javaPropertyFilter != null) && (javaPropertyFilter.apply(root, name, value))) {
        continue;
      }
      String key = JSONUtils.convertToJavaIdentifier(name, jsonConfig);
      try {
        PropertyDescriptor pd = PropertyUtils.getPropertyDescriptor(root, key);
        if ((pd != null) && (pd.getWriteMethod() == null)) {
          log.info("Property '" + key + "' of " + root.getClass() + " has no write method. SKIPPED.");
          continue;
        }

        if (!JSONUtils.isNull(value)) {
          if ((value instanceof JSONArray)) {
            if ((pd == null) || (List.class.isAssignableFrom(pd.getPropertyType()))) {
              Class targetClass = findTargetClass(key, classMap);
              targetClass = targetClass == null ? findTargetClass(name, classMap) : targetClass;

              Object newRoot = jsonConfig.getNewBeanInstanceStrategy().newInstance(targetClass, null);

              List list = JSONArray.toList((JSONArray)value, newRoot, jsonConfig);
              setProperty(root, key, list, jsonConfig);
            } else {
              Class innerType = JSONUtils.getInnerComponentType(pd.getPropertyType());
              Class targetInnerType = findTargetClass(key, classMap);
              if ((innerType.equals(Object.class)) && (targetInnerType != null) && (!targetInnerType.equals(Object.class)))
              {
                innerType = targetInnerType;
              }
              Object newRoot = jsonConfig.getNewBeanInstanceStrategy().newInstance(innerType, null);

              Object array = JSONArray.toArray((JSONArray)value, newRoot, jsonConfig);
              if ((innerType.isPrimitive()) || (JSONUtils.isNumber(innerType)) || (Boolean.class.isAssignableFrom(innerType)) || (JSONUtils.isString(innerType)))
              {
                array = JSONUtils.getMorpherRegistry().morph(Array.newInstance(innerType, 0).getClass(), array);
              }
              else if (!array.getClass().equals(pd.getPropertyType()))
              {
                if (!pd.getPropertyType().equals(Object.class))
                {
                  Morpher morpher = JSONUtils.getMorpherRegistry().getMorpherFor(Array.newInstance(innerType, 0).getClass());

                  if (IdentityObjectMorpher.getInstance().equals(morpher))
                  {
                    ObjectArrayMorpher beanMorpher = new ObjectArrayMorpher(new BeanMorpher(innerType, JSONUtils.getMorpherRegistry()));

                    JSONUtils.getMorpherRegistry().registerMorpher(beanMorpher);
                  }

                  array = JSONUtils.getMorpherRegistry().morph(Array.newInstance(innerType, 0).getClass(), array);
                }

              }

              setProperty(root, key, array, jsonConfig);
            }
          } else if ((String.class.isAssignableFrom(type)) || (JSONUtils.isBoolean(type)) || (JSONUtils.isNumber(type)) || (JSONUtils.isString(type)) || (JSONFunction.class.isAssignableFrom(type)))
          {
            if (pd != null) {
              if ((jsonConfig.isHandleJettisonEmptyElement()) && ("".equals(value))) {
                setProperty(root, key, null, jsonConfig);
              } else if (!pd.getPropertyType().isInstance(value))
              {
                Morpher morpher = JSONUtils.getMorpherRegistry().getMorpherFor(pd.getPropertyType());

                if (IdentityObjectMorpher.getInstance().equals(morpher))
                {
                  log.warn("Can't transform property '" + key + "' from " + type.getName() + " into " + pd.getPropertyType().getName() + ". Will register a default BeanMorpher");

                  JSONUtils.getMorpherRegistry().registerMorpher(new BeanMorpher(pd.getPropertyType(), JSONUtils.getMorpherRegistry()));
                }

                setProperty(root, key, JSONUtils.getMorpherRegistry().morph(pd.getPropertyType(), value), jsonConfig);
              }
              else {
                setProperty(root, key, value, jsonConfig);
              }
            } else if ((root instanceof Map))
              setProperty(root, key, value, jsonConfig);
            else {
              log.warn("Tried to assign property " + key + ":" + type.getName() + " to bean of class " + root.getClass().getName());
            }

          }
          else if (pd != null) {
            Class targetClass = pd.getPropertyType();
            if (jsonConfig.isHandleJettisonSingleElementArray()) {
              JSONArray array = new JSONArray().element(value, jsonConfig);
              Class newTargetClass = findTargetClass(key, classMap);
              newTargetClass = newTargetClass == null ? findTargetClass(name, classMap) : newTargetClass;

              Object newRoot = jsonConfig.getNewBeanInstanceStrategy().newInstance(newTargetClass, null);

              if (targetClass.isArray()) {
                setProperty(root, key, JSONArray.toArray(array, newRoot, jsonConfig), jsonConfig);
              }
              else if (Collection.class.isAssignableFrom(targetClass)) {
                setProperty(root, key, JSONArray.toList(array, newRoot, jsonConfig), jsonConfig);
              }
              else if (JSONArray.class.isAssignableFrom(targetClass))
                setProperty(root, key, array, jsonConfig);
              else
                setProperty(root, key, toBean((JSONObject)value, newRoot, jsonConfig), jsonConfig);
            }
            else
            {
              if (targetClass == Object.class) {
                targetClass = findTargetClass(key, classMap);
                targetClass = targetClass == null ? findTargetClass(name, classMap) : targetClass;
              }

              Object newRoot = jsonConfig.getNewBeanInstanceStrategy().newInstance(targetClass, null);

              setProperty(root, key, toBean((JSONObject)value, newRoot, jsonConfig), jsonConfig);
            }
          }
          else if ((root instanceof Map)) {
            Class targetClass = findTargetClass(key, classMap);
            targetClass = targetClass == null ? findTargetClass(name, classMap) : targetClass;

            Object newRoot = jsonConfig.getNewBeanInstanceStrategy().newInstance(targetClass, null);

            setProperty(root, key, toBean((JSONObject)value, newRoot, jsonConfig), jsonConfig);
          }
          else {
            log.warn("Tried to assign property " + key + ":" + type.getName() + " to bean of class " + rootClass.getName());
          }

        }
        else if (type.isPrimitive())
        {
          log.warn("Tried to assign null value to " + key + ":" + type.getName());
          setProperty(root, key, JSONUtils.getMorpherRegistry().morph(type, null), jsonConfig);
        }
        else {
          setProperty(root, key, null, jsonConfig);
        }
      }
      catch (JSONException jsone) {
        throw jsone;
      } catch (Exception e) {
        throw new JSONException("Error while setting property=" + name + " type " + type, e);
      }
    }

    return root;
  }

  private static JSONObject _fromBean(Object bean, JsonConfig jsonConfig)
  {
    if (!addInstance(bean)) {
      try {
        return jsonConfig.getCycleDetectionStrategy().handleRepeatedReferenceAsObject(bean);
      }
      catch (JSONException jsone) {
        removeInstance(bean);
        fireErrorEvent(jsone, jsonConfig);
        throw jsone;
      } catch (RuntimeException e) {
        removeInstance(bean);
        JSONException jsone = new JSONException(e);
        fireErrorEvent(jsone, jsonConfig);
        throw jsone;
      }
    }
    fireObjectStartEvent(jsonConfig);

    JsonBeanProcessor processor = jsonConfig.findJsonBeanProcessor(bean.getClass());
    if (processor != null) {
      JSONObject json = null;
      try {
        json = processor.processBean(bean, jsonConfig);
        if (json == null) {
          json = (JSONObject)jsonConfig.findDefaultValueProcessor(bean.getClass()).getDefaultValue(bean.getClass());

          if (json == null) {
            json = new JSONObject(true);
          }
        }
        removeInstance(bean);
        fireObjectEndEvent(jsonConfig);
      } catch (JSONException jsone) {
        removeInstance(bean);
        fireErrorEvent(jsone, jsonConfig);
        throw jsone;
      } catch (RuntimeException e) {
        removeInstance(bean);
        JSONException jsone = new JSONException(e);
        fireErrorEvent(jsone, jsonConfig);
        throw jsone;
      }
      return json;
    }

    Class beanClass = bean.getClass();
    PropertyNameProcessor propertyNameProcessor = jsonConfig.findJsonPropertyNameProcessor(beanClass);
    Collection exclusions = jsonConfig.getMergedExcludes(beanClass);
    JSONObject jsonObject = new JSONObject();
    try {
      PropertyDescriptor[] pds = PropertyUtils.getPropertyDescriptors(bean);
      PropertyFilter jsonPropertyFilter = jsonConfig.getJsonPropertyFilter();
      for (int i = 0; i < pds.length; i++) {
        boolean bypass = false;
        String key = pds[i].getName();
        if (exclusions.contains(key))
        {
          continue;
        }
        if ((jsonConfig.isIgnoreTransientFields()) && (isTransientField(key, beanClass, jsonConfig)))
        {
          continue;
        }
        Class type = pds[i].getPropertyType();
        try { pds[i].getReadMethod();
        } catch (Exception e)
        {
          String warning = "Property '" + key + "' of " + beanClass + " has no read method. SKIPPED";
          fireWarnEvent(warning, jsonConfig);
          log.info(warning);
          continue;
        }
        if (pds[i].getReadMethod() != null)
        {
          if (isTransient(pds[i].getReadMethod(), jsonConfig))
            continue;
          Object value = PropertyUtils.getProperty(bean, key);
          if ((jsonPropertyFilter != null) && (jsonPropertyFilter.apply(bean, key, value))) {
            continue;
          }
          JsonValueProcessor jsonValueProcessor = jsonConfig.findJsonValueProcessor(beanClass, type, key);

          if (jsonValueProcessor != null) {
            value = jsonValueProcessor.processObjectValue(key, value, jsonConfig);
            bypass = true;
            if (!JsonVerifier.isValidJsonValue(value)) {
              throw new JSONException("Value is not a valid JSON value. " + value);
            }
          }
          if (propertyNameProcessor != null) {
            key = propertyNameProcessor.processPropertyName(beanClass, key);
          }
          setValue(jsonObject, key, value, type, jsonConfig, bypass);
        } else {
          String warning = "Property '" + key + "' of " + beanClass + " has no read method. SKIPPED";
          fireWarnEvent(warning, jsonConfig);
          log.info(warning);
        }
      }

      try
      {
        if (!jsonConfig.isIgnorePublicFields()) {
          Field[] fields = beanClass.getFields();
          for (int i = 0; i < fields.length; i++) {
            boolean bypass = false;
            Field field = fields[i];
            String key = field.getName();
            if (exclusions.contains(key))
            {
              continue;
            }
            if ((jsonConfig.isIgnoreTransientFields()) && (isTransient(field, jsonConfig)))
            {
              continue;
            }
            Class type = field.getType();
            Object value = field.get(bean);
            if ((jsonPropertyFilter != null) && (jsonPropertyFilter.apply(bean, key, value))) {
              continue;
            }
            JsonValueProcessor jsonValueProcessor = jsonConfig.findJsonValueProcessor(beanClass, type, key);
            if (jsonValueProcessor != null) {
              value = jsonValueProcessor.processObjectValue(key, value, jsonConfig);
              bypass = true;
              if (!JsonVerifier.isValidJsonValue(value)) {
                throw new JSONException("Value is not a valid JSON value. " + value);
              }
            }
            if (propertyNameProcessor != null) {
              key = propertyNameProcessor.processPropertyName(beanClass, key);
            }
            setValue(jsonObject, key, value, type, jsonConfig, bypass);
          }
        }
      }
      catch (Exception e) {
        log.trace("Couldn't read public fields.", e);
      }
    } catch (JSONException jsone) {
      removeInstance(bean);
      fireErrorEvent(jsone, jsonConfig);
      throw jsone;
    } catch (Exception e) {
      removeInstance(bean);
      JSONException jsone = new JSONException(e);
      fireErrorEvent(jsone, jsonConfig);
      throw jsone;
    }

    removeInstance(bean);
    fireObjectEndEvent(jsonConfig);
    return jsonObject;
  }

  private static JSONObject _fromDynaBean(DynaBean bean, JsonConfig jsonConfig) {
    if (bean == null) {
      fireObjectStartEvent(jsonConfig);
      fireObjectEndEvent(jsonConfig);
      return new JSONObject(true);
    }

    if (!addInstance(bean)) {
      try {
        return jsonConfig.getCycleDetectionStrategy().handleRepeatedReferenceAsObject(bean);
      }
      catch (JSONException jsone) {
        removeInstance(bean);
        fireErrorEvent(jsone, jsonConfig);
        throw jsone;
      } catch (RuntimeException e) {
        removeInstance(bean);
        JSONException jsone = new JSONException(e);
        fireErrorEvent(jsone, jsonConfig);
        throw jsone;
      }
    }
    fireObjectStartEvent(jsonConfig);

    JSONObject jsonObject = new JSONObject();
    try {
      DynaProperty[] props = bean.getDynaClass().getDynaProperties();

      Collection exclusions = jsonConfig.getMergedExcludes();
      PropertyFilter jsonPropertyFilter = jsonConfig.getJsonPropertyFilter();
      for (int i = 0; i < props.length; i++) {
        boolean bypass = false;
        DynaProperty dynaProperty = props[i];
        String key = dynaProperty.getName();
        if (exclusions.contains(key)) {
          continue;
        }
        Class type = dynaProperty.getType();
        Object value = bean.get(dynaProperty.getName());
        if ((jsonPropertyFilter != null) && (jsonPropertyFilter.apply(bean, key, value))) {
          continue;
        }
        JsonValueProcessor jsonValueProcessor = jsonConfig.findJsonValueProcessor(type, key);
        if (jsonValueProcessor != null) {
          value = jsonValueProcessor.processObjectValue(key, value, jsonConfig);
          bypass = true;
          if (!JsonVerifier.isValidJsonValue(value)) {
            throw new JSONException("Value is not a valid JSON value. " + value);
          }
        }
        setValue(jsonObject, key, value, type, jsonConfig, bypass);
      }
    } catch (JSONException jsone) {
      removeInstance(bean);
      fireErrorEvent(jsone, jsonConfig);
      throw jsone;
    } catch (RuntimeException e) {
      removeInstance(bean);
      JSONException jsone = new JSONException(e);
      fireErrorEvent(jsone, jsonConfig);
      throw jsone;
    }

    removeInstance(bean);
    fireObjectEndEvent(jsonConfig);
    return jsonObject;
  }

  private static JSONObject _fromJSONObject(JSONObject object, JsonConfig jsonConfig) {
    if ((object == null) || (object.isNullObject())) {
      fireObjectStartEvent(jsonConfig);
      fireObjectEndEvent(jsonConfig);
      return new JSONObject(true);
    }

    if (!addInstance(object)) {
      try {
        return jsonConfig.getCycleDetectionStrategy().handleRepeatedReferenceAsObject(object);
      }
      catch (JSONException jsone) {
        removeInstance(object);
        fireErrorEvent(jsone, jsonConfig);
        throw jsone;
      } catch (RuntimeException e) {
        removeInstance(object);
        JSONException jsone = new JSONException(e);
        fireErrorEvent(jsone, jsonConfig);
        throw jsone;
      }
    }
    fireObjectStartEvent(jsonConfig);

    JSONArray sa = object.names(jsonConfig);
    Collection exclusions = jsonConfig.getMergedExcludes();
    JSONObject jsonObject = new JSONObject();
    PropertyFilter jsonPropertyFilter = jsonConfig.getJsonPropertyFilter();
    for (Iterator i = sa.iterator(); i.hasNext(); ) {
      Object k = i.next();
      if (k == null) {
        throw new JSONException("JSON keys cannot be null.");
      }
      if ((!(k instanceof String)) && (!jsonConfig.isAllowNonStringKeys())) {
        throw new ClassCastException("JSON keys must be strings.");
      }
      String key = String.valueOf(k);
      if ("null".equals(key)) {
        throw new NullPointerException("JSON keys must not be null nor the 'null' string.");
      }
      if (exclusions.contains(key)) {
        continue;
      }
      Object value = object.opt(key);
      if ((jsonPropertyFilter != null) && (jsonPropertyFilter.apply(object, key, value))) {
        continue;
      }
      if (jsonObject.properties.containsKey(key)) {
        jsonObject.accumulate(key, value, jsonConfig);
        firePropertySetEvent(key, value, true, jsonConfig);
      } else {
        jsonObject.setInternal(key, value, jsonConfig);
        firePropertySetEvent(key, value, false, jsonConfig);
      }
    }

    removeInstance(object);
    fireObjectEndEvent(jsonConfig);
    return jsonObject;
  }

  private static JSONObject _fromJSONString(JSONString string, JsonConfig jsonConfig) {
    return _fromJSONTokener(new JSONTokener(string.toJSONString()), jsonConfig);
  }

  private static JSONObject _fromJSONTokener(JSONTokener tokener, JsonConfig jsonConfig)
  {
    try
    {
      if (tokener.matches("null.*")) {
        fireObjectStartEvent(jsonConfig);
        fireObjectEndEvent(jsonConfig);
        return new JSONObject(true);
      }

      if (tokener.nextClean() != '{') {
        throw tokener.syntaxError("A JSONObject text must begin with '{'");
      }
      fireObjectStartEvent(jsonConfig);

      Collection exclusions = jsonConfig.getMergedExcludes();
      PropertyFilter jsonPropertyFilter = jsonConfig.getJsonPropertyFilter();
      JSONObject jsonObject = new JSONObject();
      while (true) {
        char c = tokener.nextClean();
        switch (c) {
        case '\000':
          throw tokener.syntaxError("A JSONObject text must end with '}'");
        case '}':
          fireObjectEndEvent(jsonConfig);
          return jsonObject;
        }
        tokener.back();
        String key = tokener.nextValue(jsonConfig).toString();

        c = tokener.nextClean();
        if (c == '=') {
          if (tokener.next() != '>')
            tokener.back();
        }
        else if (c != ':') {
          throw tokener.syntaxError("Expected a ':' after a key");
        }

        char peek = tokener.peek();
        boolean quoted = (peek == '"') || (peek == '\'');
        Object v = tokener.nextValue(jsonConfig);
        if ((quoted) || (!JSONUtils.isFunctionHeader(v))) {
          if (exclusions.contains(key)) {
            switch (tokener.nextClean()) {
            case ',':
            case ';':
              if (tokener.nextClean() == '}') {
                fireObjectEndEvent(jsonConfig);
                return jsonObject;
              }
              tokener.back();
              break;
            case '}':
              fireObjectEndEvent(jsonConfig);
              return jsonObject;
            default:
              throw tokener.syntaxError("Expected a ',' or '}'");
            }
          }

          if ((jsonPropertyFilter == null) || (!jsonPropertyFilter.apply(tokener, key, v))) {
            if ((quoted) && ((v instanceof String)) && ((JSONUtils.mayBeJSON((String)v)) || (JSONUtils.isFunction(v)))) {
              v = "\"" + v + "\"";
            }
            if (jsonObject.properties.containsKey(key)) {
              jsonObject.accumulate(key, v, jsonConfig);
              firePropertySetEvent(key, v, true, jsonConfig);
            } else {
              jsonObject.element(key, v, jsonConfig);
              firePropertySetEvent(key, v, false, jsonConfig);
            }
          }
        }
        else {
          String params = JSONUtils.getFunctionParams((String)v);

          int i = 0;
          StringBuffer sb = new StringBuffer();
          while (true) {
            char ch = tokener.next();
            if (ch == 0) {
              break;
            }
            if (ch == '{') {
              i++;
            }
            if (ch == '}') {
              i--;
            }
            sb.append(ch);
            if (i == 0) {
              break;
            }
          }
          if (i != 0) {
            throw tokener.syntaxError("Unbalanced '{' or '}' on prop: " + v);
          }

          String text = sb.toString();
          text = text.substring(1, text.length() - 1).trim();

          Object value = new JSONFunction(params != null ? StringUtils.split(params, ",") : null, text);

          if ((jsonPropertyFilter == null) || (!jsonPropertyFilter.apply(tokener, key, value))) {
            if (jsonObject.properties.containsKey(key)) {
              jsonObject.accumulate(key, value, jsonConfig);
              firePropertySetEvent(key, value, true, jsonConfig);
            } else {
              jsonObject.element(key, value, jsonConfig);
              firePropertySetEvent(key, value, false, jsonConfig);
            }

          }

        }

        switch (tokener.nextClean()) {
        case ',':
        case ';':
          if (tokener.nextClean() == '}') {
            fireObjectEndEvent(jsonConfig);
            return jsonObject;
          }
          tokener.back();
          break;
        case '}':
          fireObjectEndEvent(jsonConfig);
          return jsonObject;
        default:
          throw tokener.syntaxError("Expected a ',' or '}'");
        }
      }
    } catch (JSONException jsone) {
      fireErrorEvent(jsone, jsonConfig);
    }throw jsone;
  }

  private static JSONObject _fromMap(Map map, JsonConfig jsonConfig)
  {
    if (map == null) {
      fireObjectStartEvent(jsonConfig);
      fireObjectEndEvent(jsonConfig);
      return new JSONObject(true);
    }

    if (!addInstance(map)) {
      try {
        return jsonConfig.getCycleDetectionStrategy().handleRepeatedReferenceAsObject(map);
      }
      catch (JSONException jsone) {
        removeInstance(map);
        fireErrorEvent(jsone, jsonConfig);
        throw jsone;
      } catch (RuntimeException e) {
        removeInstance(map);
        JSONException jsone = new JSONException(e);
        fireErrorEvent(jsone, jsonConfig);
        throw jsone;
      }
    }
    fireObjectStartEvent(jsonConfig);

    Collection exclusions = jsonConfig.getMergedExcludes();
    JSONObject jsonObject = new JSONObject();
    PropertyFilter jsonPropertyFilter = jsonConfig.getJsonPropertyFilter();
    try {
      Iterator entries = map.entrySet().iterator();
      while (entries.hasNext()) {
        boolean bypass = false;
        Map.Entry entry = (Map.Entry)entries.next();
        Object k = entry.getKey();
        if (k == null) {
          throw new JSONException("JSON keys cannot be null.");
        }
        if ((!(k instanceof String)) && (!jsonConfig.isAllowNonStringKeys())) {
          throw new ClassCastException("JSON keys must be strings.");
        }
        String key = String.valueOf(k);
        if ("null".equals(key)) {
          throw new NullPointerException("JSON keys must not be null nor the 'null' string.");
        }
        if (exclusions.contains(key)) {
          continue;
        }
        Object value = entry.getValue();
        if ((jsonPropertyFilter != null) && (jsonPropertyFilter.apply(map, key, value))) {
          continue;
        }
        if (value != null) {
          JsonValueProcessor jsonValueProcessor = jsonConfig.findJsonValueProcessor(value.getClass(), key);

          if (jsonValueProcessor != null) {
            value = jsonValueProcessor.processObjectValue(key, value, jsonConfig);
            bypass = true;
            if (!JsonVerifier.isValidJsonValue(value)) {
              throw new JSONException("Value is not a valid JSON value. " + value);
            }
          }
          setValue(jsonObject, key, value, value.getClass(), jsonConfig, bypass);
        }
        else if (jsonObject.properties.containsKey(key)) {
          jsonObject.accumulate(key, JSONNull.getInstance());
          firePropertySetEvent(key, JSONNull.getInstance(), true, jsonConfig);
        } else {
          jsonObject.element(key, JSONNull.getInstance());
          firePropertySetEvent(key, JSONNull.getInstance(), false, jsonConfig);
        }
      }
    }
    catch (JSONException jsone) {
      removeInstance(map);
      fireErrorEvent(jsone, jsonConfig);
      throw jsone;
    } catch (RuntimeException e) {
      removeInstance(map);
      JSONException jsone = new JSONException(e);
      fireErrorEvent(jsone, jsonConfig);
      throw jsone;
    }

    removeInstance(map);
    fireObjectEndEvent(jsonConfig);
    return jsonObject;
  }

  private static JSONObject _fromString(String str, JsonConfig jsonConfig) {
    if ((str == null) || ("null".equals(str))) {
      fireObjectStartEvent(jsonConfig);
      fireObjectEndEvent(jsonConfig);
      return new JSONObject(true);
    }
    return _fromJSONTokener(new JSONTokener(str), jsonConfig);
  }

  private static Object convertPropertyValueToArray(String key, Object value, Class targetType, JsonConfig jsonConfig, Map classMap)
  {
    Class innerType = JSONUtils.getInnerComponentType(targetType);
    Class targetInnerType = findTargetClass(key, classMap);
    if ((innerType.equals(Object.class)) && (targetInnerType != null) && (!targetInnerType.equals(Object.class)))
    {
      innerType = targetInnerType;
    }
    JsonConfig jsc = jsonConfig.copy();
    jsc.setRootClass(innerType);
    jsc.setClassMap(classMap);
    Object array = JSONArray.toArray((JSONArray)value, jsc);
    if ((innerType.isPrimitive()) || (JSONUtils.isNumber(innerType)) || (Boolean.class.isAssignableFrom(innerType)) || (JSONUtils.isString(innerType)))
    {
      array = JSONUtils.getMorpherRegistry().morph(Array.newInstance(innerType, 0).getClass(), array);
    }
    else if (!array.getClass().equals(targetType))
    {
      if (!targetType.equals(Object.class)) {
        Morpher morpher = JSONUtils.getMorpherRegistry().getMorpherFor(Array.newInstance(innerType, 0).getClass());

        if (IdentityObjectMorpher.getInstance().equals(morpher))
        {
          ObjectArrayMorpher beanMorpher = new ObjectArrayMorpher(new BeanMorpher(innerType, JSONUtils.getMorpherRegistry()));

          JSONUtils.getMorpherRegistry().registerMorpher(beanMorpher);
        }

        array = JSONUtils.getMorpherRegistry().morph(Array.newInstance(innerType, 0).getClass(), array);
      }

    }

    return array;
  }

  private static List convertPropertyValueToList(String key, Object value, JsonConfig jsonConfig, String name, Map classMap)
  {
    Class targetClass = findTargetClass(key, classMap);
    targetClass = targetClass == null ? findTargetClass(name, classMap) : targetClass;
    JsonConfig jsc = jsonConfig.copy();
    jsc.setRootClass(targetClass);
    jsc.setClassMap(classMap);
    List list = (List)JSONArray.toCollection((JSONArray)value, jsc);
    return list;
  }

  private static Collection convertPropertyValueToCollection(String key, Object value, JsonConfig jsonConfig, String name, Map classMap, Class collectionType)
  {
    Class targetClass = findTargetClass(key, classMap);
    targetClass = targetClass == null ? findTargetClass(name, classMap) : targetClass;
    JsonConfig jsc = jsonConfig.copy();
    jsc.setRootClass(targetClass);
    jsc.setClassMap(classMap);
    jsc.setCollectionType(collectionType);
    return JSONArray.toCollection((JSONArray)value, jsc);
  }

  private static Class findTargetClass(String key, Map classMap)
  {
    Class targetClass = (Class)classMap.get(key);
    if (targetClass == null)
    {
      Iterator i = classMap.entrySet().iterator();
      while (i.hasNext()) {
        Map.Entry entry = (Map.Entry)i.next();
        if (RegexpUtils.getMatcher((String)entry.getKey()).matches(key))
        {
          targetClass = (Class)entry.getValue();
          break;
        }
      }
    }

    return targetClass;
  }

  private static boolean isTransientField(String name, Class beanClass, JsonConfig jsonConfig) {
    try {
      Field field = beanClass.getDeclaredField(name);
      if ((field.getModifiers() & 0x80) == 128) return true;
      return isTransient(field, jsonConfig);
    } catch (Exception e) {
      log.info("Error while inspecting field " + beanClass + "." + name + " for transient status.", e);
    }
    return false;
  }

  private static boolean isTransient(AnnotatedElement element, JsonConfig jsonConfig) {
    for (Iterator annotations = jsonConfig.getIgnoreFieldAnnotations().iterator(); annotations.hasNext(); ) {
      try {
        String annotationClassName = (String)annotations.next();
        if (element.getAnnotation(Class.forName(annotationClassName)) != null) return true; 
      }
      catch (Exception e) {
        log.info("Error while inspecting " + element + " for transient status.", e);
      }
    }
    return false;
  }

  private static Object morphPropertyValue(String key, Object value, Class type, Class targetType) {
    Morpher morpher = JSONUtils.getMorpherRegistry().getMorpherFor(targetType);

    if (IdentityObjectMorpher.getInstance().equals(morpher))
    {
      log.warn("Can't transform property '" + key + "' from " + type.getName() + " into " + targetType.getName() + ". Will register a default Morpher");

      if (Enum.class.isAssignableFrom(targetType)) {
        JSONUtils.getMorpherRegistry().registerMorpher(new EnumMorpher(targetType));
      }
      else {
        JSONUtils.getMorpherRegistry().registerMorpher(new BeanMorpher(targetType, JSONUtils.getMorpherRegistry()));
      }

    }

    value = JSONUtils.getMorpherRegistry().morph(targetType, value);

    return value;
  }

  private static void setProperty(Object bean, String key, Object value, JsonConfig jsonConfig)
    throws Exception
  {
    PropertySetStrategy propertySetStrategy = jsonConfig.getPropertySetStrategy() != null ? jsonConfig.getPropertySetStrategy() : PropertySetStrategy.DEFAULT;

    propertySetStrategy.setProperty(bean, key, value, jsonConfig);
  }

  private static void setValue(JSONObject jsonObject, String key, Object value, Class type, JsonConfig jsonConfig, boolean bypass)
  {
    boolean accumulated = false;
    if (value == null) {
      value = jsonConfig.findDefaultValueProcessor(type).getDefaultValue(type);

      if (!JsonVerifier.isValidJsonValue(value)) {
        throw new JSONException("Value is not a valid JSON value. " + value);
      }
    }
    if (jsonObject.properties.containsKey(key)) {
      if (String.class.isAssignableFrom(type)) {
        Object o = jsonObject.opt(key);
        if ((o instanceof JSONArray))
          ((JSONArray)o).addString((String)value);
        else
          jsonObject.properties.put(key, new JSONArray().element(o).addString((String)value));
      }
      else
      {
        jsonObject.accumulate(key, value, jsonConfig);
      }
      accumulated = true;
    }
    else if ((bypass) || (String.class.isAssignableFrom(type))) {
      jsonObject.properties.put(key, value);
    } else {
      jsonObject.setInternal(key, value, jsonConfig);
    }

    value = jsonObject.opt(key);
    if (accumulated) {
      JSONArray array = (JSONArray)value;
      value = array.get(array.size() - 1);
    }
    firePropertySetEvent(key, value, accumulated, jsonConfig);
  }

  public JSONObject()
  {
    this.properties = new ListOrderedMap();
  }

  public JSONObject(boolean isNull)
  {
    this();
    this.nullObject = isNull;
  }

  public JSONObject accumulate(String key, boolean value)
  {
    return _accumulate(key, value ? Boolean.TRUE : Boolean.FALSE, new JsonConfig());
  }

  public JSONObject accumulate(String key, double value)
  {
    return _accumulate(key, Double.valueOf(value), new JsonConfig());
  }

  public JSONObject accumulate(String key, int value)
  {
    return _accumulate(key, Integer.valueOf(value), new JsonConfig());
  }

  public JSONObject accumulate(String key, long value)
  {
    return _accumulate(key, Long.valueOf(value), new JsonConfig());
  }

  public JSONObject accumulate(String key, Object value)
  {
    return _accumulate(key, value, new JsonConfig());
  }

  public JSONObject accumulate(String key, Object value, JsonConfig jsonConfig)
  {
    return _accumulate(key, value, jsonConfig);
  }

  public void accumulateAll(Map map) {
    accumulateAll(map, new JsonConfig());
  }

  public void accumulateAll(Map map, JsonConfig jsonConfig) {
    if ((map instanceof JSONObject)) {
      Iterator entries = map.entrySet().iterator();
      while (entries.hasNext()) {
        Map.Entry entry = (Map.Entry)entries.next();
        String key = (String)entry.getKey();
        Object value = entry.getValue();
        accumulate(key, value, jsonConfig);
      }
    } else {
      Iterator entries = map.entrySet().iterator();
      while (entries.hasNext()) {
        Map.Entry entry = (Map.Entry)entries.next();
        String key = String.valueOf(entry.getKey());
        Object value = entry.getValue();
        accumulate(key, value, jsonConfig);
      }
    }
  }

  public void clear() {
    this.properties.clear();
  }

  public int compareTo(Object obj) {
    if ((obj != null) && ((obj instanceof JSONObject))) {
      JSONObject other = (JSONObject)obj;
      int size1 = size();
      int size2 = other.size();
      if (size1 < size2)
        return -1;
      if (size1 > size2)
        return 1;
      if (equals(other)) {
        return 0;
      }
    }
    return -1;
  }

  public boolean containsKey(Object key) {
    return this.properties.containsKey(key);
  }

  public boolean containsValue(Object value) {
    return containsValue(value, new JsonConfig());
  }

  public boolean containsValue(Object value, JsonConfig jsonConfig) {
    try {
      value = processValue(value, jsonConfig);
    } catch (JSONException e) {
      return false;
    }
    return this.properties.containsValue(value);
  }

  public JSONObject discard(String key)
  {
    verifyIsNull();
    this.properties.remove(key);
    return this;
  }

  public JSONObject element(String key, boolean value)
  {
    verifyIsNull();
    return element(key, value ? Boolean.TRUE : Boolean.FALSE);
  }

  public JSONObject element(String key, Collection value)
  {
    return element(key, value, new JsonConfig());
  }

  public JSONObject element(String key, Collection value, JsonConfig jsonConfig)
  {
    if (!(value instanceof JSONArray)) {
      value = JSONArray.fromObject(value, jsonConfig);
    }
    return setInternal(key, value, jsonConfig);
  }

  public JSONObject element(String key, double value)
  {
    verifyIsNull();
    Double d = new Double(value);
    JSONUtils.testValidity(d);
    return element(key, d);
  }

  public JSONObject element(String key, int value)
  {
    verifyIsNull();
    return element(key, new Integer(value));
  }

  public JSONObject element(String key, long value)
  {
    verifyIsNull();
    return element(key, new Long(value));
  }

  public JSONObject element(String key, Map value)
  {
    return element(key, value, new JsonConfig());
  }

  public JSONObject element(String key, Map value, JsonConfig jsonConfig)
  {
    verifyIsNull();
    if ((value instanceof JSONObject)) {
      return setInternal(key, value, jsonConfig);
    }
    return element(key, fromObject(value, jsonConfig), jsonConfig);
  }

  public JSONObject element(String key, Object value)
  {
    return element(key, value, new JsonConfig());
  }

  public JSONObject element(String key, Object value, JsonConfig jsonConfig)
  {
    verifyIsNull();
    if (key == null) {
      throw new JSONException("Null key.");
    }
    if (value != null) {
      value = processValue(key, value, jsonConfig);
      _setInternal(key, value, jsonConfig);
    } else {
      remove(key);
    }
    return this;
  }

  public JSONObject elementOpt(String key, Object value)
  {
    return elementOpt(key, value, new JsonConfig());
  }

  public JSONObject elementOpt(String key, Object value, JsonConfig jsonConfig)
  {
    verifyIsNull();
    if ((key != null) && (value != null)) {
      element(key, value, jsonConfig);
    }
    return this;
  }

  public Set entrySet() {
    return Collections.unmodifiableSet(this.properties.entrySet());
  }

  public boolean equals(Object obj) {
    if (obj == this) {
      return true;
    }
    if (obj == null) {
      return false;
    }

    if (!(obj instanceof JSONObject)) {
      return false;
    }

    JSONObject other = (JSONObject)obj;

    if (isNullObject())
    {
      return other.isNullObject();
    }

    if (other.isNullObject()) {
      return false;
    }

    if (other.size() != size()) {
      return false;
    }

    Iterator keys = this.properties.keySet().iterator();
    while (keys.hasNext()) {
      String key = (String)keys.next();
      if (!other.properties.containsKey(key)) {
        return false;
      }
      Object o1 = this.properties.get(key);
      Object o2 = other.properties.get(key);

      if (JSONNull.getInstance().equals(o1))
      {
        if (!JSONNull.getInstance().equals(o2))
        {
          return false;
        }
      }
      if (JSONNull.getInstance().equals(o2))
      {
        return false;
      }

      if (((o1 instanceof String)) && ((o2 instanceof JSONFunction))) {
        if (!o1.equals(String.valueOf(o2)))
          return false;
      }
      else if (((o1 instanceof JSONFunction)) && ((o2 instanceof String))) {
        if (!o2.equals(String.valueOf(o1)))
          return false;
      }
      else if (((o1 instanceof JSONObject)) && ((o2 instanceof JSONObject))) {
        if (!o1.equals(o2))
          return false;
      }
      else if (((o1 instanceof JSONArray)) && ((o2 instanceof JSONArray))) {
        if (!o1.equals(o2))
          return false;
      }
      else if (((o1 instanceof JSONFunction)) && ((o2 instanceof JSONFunction))) {
        if (!o1.equals(o2)) {
          return false;
        }
      }
      else if ((o1 instanceof String)) {
        if (!o1.equals(String.valueOf(o2)))
          return false;
      }
      else if ((o2 instanceof String)) {
        if (!o2.equals(String.valueOf(o1)))
          return false;
      }
      else {
        Morpher m1 = JSONUtils.getMorpherRegistry().getMorpherFor(o1.getClass());

        Morpher m2 = JSONUtils.getMorpherRegistry().getMorpherFor(o2.getClass());

        if ((m1 != null) && (m1 != IdentityObjectMorpher.getInstance())) {
          if (!o1.equals(JSONUtils.getMorpherRegistry().morph(o1.getClass(), o2)))
          {
            return false;
          }
        } else if ((m2 != null) && (m2 != IdentityObjectMorpher.getInstance())) {
          if (!JSONUtils.getMorpherRegistry().morph(o1.getClass(), o1).equals(o2))
          {
            return false;
          }
        }
        else if (!o1.equals(o2)) {
          return false;
        }
      }

    }

    return true;
  }

  public Object get(Object key) {
    if ((key instanceof String)) {
      return get((String)key);
    }
    return null;
  }

  public Object get(String key)
  {
    verifyIsNull();
    return this.properties.get(key);
  }

  public boolean getBoolean(String key)
  {
    verifyIsNull();
    Object o = get(key);
    if (o != null) {
      if ((o.equals(Boolean.FALSE)) || (((o instanceof String)) && (((String)o).equalsIgnoreCase("false"))))
      {
        return false;
      }if ((o.equals(Boolean.TRUE)) || (((o instanceof String)) && (((String)o).equalsIgnoreCase("true"))))
      {
        return true;
      }
    }
    throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a Boolean.");
  }

  public double getDouble(String key)
  {
    verifyIsNull();
    Object o = get(key);
    if (o != null) {
      try {
        return (o instanceof Number) ? ((Number)o).doubleValue() : Double.parseDouble((String)o);
      }
      catch (Exception e) {
        throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number.");
      }
    }
    throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number.");
  }

  public int getInt(String key)
  {
    verifyIsNull();
    Object o = get(key);
    if (o != null) {
      return (o instanceof Number) ? ((Number)o).intValue() : (int)getDouble(key);
    }
    throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number.");
  }

  public JSONArray getJSONArray(String key)
  {
    verifyIsNull();
    Object o = get(key);
    if ((o != null) && ((o instanceof JSONArray))) {
      return (JSONArray)o;
    }
    throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a JSONArray.");
  }

  public JSONObject getJSONObject(String key)
  {
    verifyIsNull();
    Object o = get(key);
    if (JSONNull.getInstance().equals(o))
    {
      return new JSONObject(true);
    }if ((o instanceof JSONObject)) {
      return (JSONObject)o;
    }
    throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a JSONObject.");
  }

  public long getLong(String key)
  {
    verifyIsNull();
    Object o = get(key);
    if (o != null) {
      return (o instanceof Number) ? ((Number)o).longValue() : ()getDouble(key);
    }
    throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number.");
  }

  public String getString(String key)
  {
    verifyIsNull();
    Object o = get(key);
    if (o != null) {
      return o.toString();
    }
    throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] not found.");
  }

  public boolean has(String key)
  {
    verifyIsNull();
    return this.properties.containsKey(key);
  }

  public int hashCode() {
    int hashcode = 19;
    if (isNullObject()) {
      return hashcode + JSONNull.getInstance().hashCode();
    }

    Iterator entries = this.properties.entrySet().iterator();
    while (entries.hasNext()) {
      Map.Entry entry = (Map.Entry)entries.next();
      Object key = entry.getKey();
      Object value = entry.getValue();
      hashcode += key.hashCode() + JSONUtils.hashCode(value);
    }
    return hashcode;
  }

  public boolean isArray() {
    return false;
  }

  public boolean isEmpty()
  {
    return this.properties.isEmpty();
  }

  public boolean isNullObject()
  {
    return this.nullObject;
  }

  public Iterator keys()
  {
    verifyIsNull();
    return keySet().iterator();
  }

  public Set keySet() {
    return Collections.unmodifiableSet(this.properties.keySet());
  }

  public JSONArray names()
  {
    verifyIsNull();
    JSONArray ja = new JSONArray();
    Iterator keys = keys();
    while (keys.hasNext()) {
      ja.element(keys.next());
    }
    return ja;
  }

  public JSONArray names(JsonConfig jsonConfig)
  {
    verifyIsNull();
    JSONArray ja = new JSONArray();
    Iterator keys = keys();
    while (keys.hasNext()) {
      ja.element(keys.next(), jsonConfig);
    }
    return ja;
  }

  public Object opt(String key)
  {
    verifyIsNull();
    return key == null ? null : this.properties.get(key);
  }

  public boolean optBoolean(String key)
  {
    verifyIsNull();
    return optBoolean(key, false);
  }

  public boolean optBoolean(String key, boolean defaultValue)
  {
    verifyIsNull();
    try {
      return getBoolean(key); } catch (Exception e) {
    }
    return defaultValue;
  }

  public double optDouble(String key)
  {
    verifyIsNull();
    return optDouble(key, (0.0D / 0.0D));
  }

  public double optDouble(String key, double defaultValue)
  {
    verifyIsNull();
    try {
      Object o = opt(key);
      return (o instanceof Number) ? ((Number)o).doubleValue() : new Double((String)o).doubleValue();
    } catch (Exception e) {
    }
    return defaultValue;
  }

  public int optInt(String key)
  {
    verifyIsNull();
    return optInt(key, 0);
  }

  public int optInt(String key, int defaultValue)
  {
    verifyIsNull();
    try {
      return getInt(key); } catch (Exception e) {
    }
    return defaultValue;
  }

  public JSONArray optJSONArray(String key)
  {
    verifyIsNull();
    Object o = opt(key);
    return (o instanceof JSONArray) ? (JSONArray)o : null;
  }

  public JSONObject optJSONObject(String key)
  {
    verifyIsNull();
    Object o = opt(key);
    return (o instanceof JSONObject) ? (JSONObject)o : null;
  }

  public long optLong(String key)
  {
    verifyIsNull();
    return optLong(key, 0L);
  }

  public long optLong(String key, long defaultValue)
  {
    verifyIsNull();
    try {
      return getLong(key); } catch (Exception e) {
    }
    return defaultValue;
  }

  public String optString(String key)
  {
    verifyIsNull();
    return optString(key, "");
  }

  public String optString(String key, String defaultValue)
  {
    verifyIsNull();
    Object o = opt(key);
    return o != null ? o.toString() : defaultValue;
  }

  public Object put(Object key, Object value) {
    if (key == null) {
      throw new IllegalArgumentException("key is null.");
    }
    Object previous = this.properties.get(key);
    element(String.valueOf(key), value);
    return previous;
  }

  public void putAll(Map map) {
    putAll(map, new JsonConfig());
  }

  public void putAll(Map map, JsonConfig jsonConfig) {
    if ((map instanceof JSONObject)) {
      Iterator entries = map.entrySet().iterator();
      while (entries.hasNext()) {
        Map.Entry entry = (Map.Entry)entries.next();
        String key = (String)entry.getKey();
        Object value = entry.getValue();
        this.properties.put(key, value);
      }
    } else {
      Iterator entries = map.entrySet().iterator();
      while (entries.hasNext()) {
        Map.Entry entry = (Map.Entry)entries.next();
        String key = String.valueOf(entry.getKey());
        Object value = entry.getValue();
        element(key, value, jsonConfig);
      }
    }
  }

  public Object remove(Object key) {
    return this.properties.remove(key);
  }

  public Object remove(String key)
  {
    verifyIsNull();
    return this.properties.remove(key);
  }

  public int size()
  {
    return this.properties.size();
  }

  public JSONArray toJSONArray(JSONArray names)
  {
    verifyIsNull();
    if ((names == null) || (names.size() == 0)) {
      return null;
    }
    JSONArray ja = new JSONArray();
    for (int i = 0; i < names.size(); i++) {
      ja.element(opt(names.getString(i)));
    }
    return ja;
  }

  public String toString()
  {
    if (isNullObject()) {
      return JSONNull.getInstance().toString();
    }
    try
    {
      Iterator keys = keys();
      StringBuffer sb = new StringBuffer("{");

      while (keys.hasNext()) {
        if (sb.length() > 1) {
          sb.append(',');
        }
        Object o = keys.next();
        sb.append(JSONUtils.quote(o.toString()));
        sb.append(':');
        sb.append(JSONUtils.valueToString(this.properties.get(o)));
      }
      sb.append('}');
      return sb.toString(); } catch (Exception e) {
    }
    return null;
  }

  public String toString(int indentFactor)
  {
    if (isNullObject()) {
      return JSONNull.getInstance().toString();
    }

    if (indentFactor == 0) {
      return toString();
    }
    return toString(indentFactor, 0);
  }

  public String toString(int indentFactor, int indent)
  {
    if (isNullObject()) {
      return JSONNull.getInstance().toString();
    }

    int n = size();
    if (n == 0) {
      return "{}";
    }
    if (indentFactor == 0) {
      return toString();
    }
    Iterator keys = keys();
    StringBuffer sb = new StringBuffer("{");
    int newindent = indent + indentFactor;

    if (n == 1) {
      Object o = keys.next();
      sb.append(JSONUtils.quote(o.toString()));
      sb.append(": ");
      sb.append(JSONUtils.valueToString(this.properties.get(o), indentFactor, indent));
    } else {
      while (keys.hasNext()) {
        Object o = keys.next();
        if (sb.length() > 1)
          sb.append(",\n");
        else {
          sb.append('\n');
        }
        for (int i = 0; i < newindent; i++) {
          sb.append(' ');
        }
        sb.append(JSONUtils.quote(o.toString()));
        sb.append(": ");
        sb.append(JSONUtils.valueToString(this.properties.get(o), indentFactor, newindent));
      }
      if (sb.length() > 1) {
        sb.append('\n');
        for (int i = 0; i < indent; i++) {
          sb.append(' ');
        }
      }
      for (int i = 0; i < indent; i++) {
        sb.insert(0, ' ');
      }
    }
    sb.append('}');
    return sb.toString();
  }

  public Collection values() {
    return Collections.unmodifiableCollection(this.properties.values());
  }

  public Writer write(Writer writer)
  {
    try
    {
      if (isNullObject()) {
        writer.write(JSONNull.getInstance().toString());

        return writer;
      }

      boolean b = false;
      Iterator keys = keys();
      writer.write(123);

      while (keys.hasNext()) {
        if (b) {
          writer.write(44);
        }
        Object k = keys.next();
        writer.write(JSONUtils.quote(k.toString()));
        writer.write(58);
        Object v = this.properties.get(k);
        if ((v instanceof JSONObject))
          ((JSONObject)v).write(writer);
        else if ((v instanceof JSONArray))
          ((JSONArray)v).write(writer);
        else {
          writer.write(JSONUtils.valueToString(v));
        }
        b = true;
      }
      writer.write(125);
      return writer; } catch (IOException e) {
    }
    throw new JSONException(e);
  }

  private JSONObject _accumulate(String key, Object value, JsonConfig jsonConfig)
  {
    if (isNullObject()) {
      throw new JSONException("Can't accumulate on null object");
    }

    if (!has(key)) {
      setInternal(key, value, jsonConfig);
    } else {
      Object o = opt(key);
      if ((o instanceof JSONArray))
        ((JSONArray)o).element(value, jsonConfig);
      else {
        setInternal(key, new JSONArray().element(o).element(value, jsonConfig), jsonConfig);
      }

    }

    return this;
  }

  protected Object _processValue(Object value, JsonConfig jsonConfig) {
    if ((value instanceof JSONTokener))
      return _fromJSONTokener((JSONTokener)value, jsonConfig);
    if ((value != null) && (Enum.class.isAssignableFrom(value.getClass()))) {
      return ((Enum)value).name();
    }
    return super._processValue(value, jsonConfig);
  }

  private JSONObject _setInternal(String key, Object value, JsonConfig jsonConfig)
  {
    verifyIsNull();
    if (key == null) {
      throw new JSONException("Null key.");
    }

    if ((JSONUtils.isString(value)) && (JSONUtils.mayBeJSON(String.valueOf(value)))) {
      this.properties.put(key, value);
    }
    else if ((CycleDetectionStrategy.IGNORE_PROPERTY_OBJ != value) && (CycleDetectionStrategy.IGNORE_PROPERTY_ARR != value))
    {
      this.properties.put(key, value);
    }

    return this;
  }

  private Object processValue(Object value, JsonConfig jsonConfig) {
    if (value != null) {
      JsonValueProcessor processor = jsonConfig.findJsonValueProcessor(value.getClass());
      if (processor != null) {
        value = processor.processObjectValue(null, value, jsonConfig);
        if (!JsonVerifier.isValidJsonValue(value)) {
          throw new JSONException("Value is not a valid JSON value. " + value);
        }
      }
    }
    return _processValue(value, jsonConfig);
  }

  private Object processValue(String key, Object value, JsonConfig jsonConfig) {
    if (value != null) {
      JsonValueProcessor processor = jsonConfig.findJsonValueProcessor(value.getClass(), key);
      if (processor != null) {
        value = processor.processObjectValue(null, value, jsonConfig);
        if (!JsonVerifier.isValidJsonValue(value)) {
          throw new JSONException("Value is not a valid JSON value. " + value);
        }
      }
    }
    return _processValue(value, jsonConfig);
  }

  private JSONObject setInternal(String key, Object value, JsonConfig jsonConfig)
  {
    return _setInternal(key, processValue(key, value, jsonConfig), jsonConfig);
  }

  private void verifyIsNull()
  {
    if (isNullObject())
      throw new JSONException("null object");
  }
}



以下是对代码进行优化的建议: 1. 避免硬编码:将数据库连接信息(DB_URL、USER、PASS)抽取为配置参数,以便在不同环境下进行配置。 2. 使用 try-with-resources 语句:可以使用 try-with-resources 语句来自动关闭资源,无需手动关闭连接和语句。 3. 统一异常处理:可以将两个 catch 块合并,并将异常处理的逻辑统一。 4. 使用预编译语句:可以使用 PreparedStatement 来执行 SQL 语句,避免 SQL 注入攻击,并提高执行效率。 5. 日志记录优化:可以使用日志框架(如SLF4J)来记录日志,以便更好地管理和定制日志输出。 下面是优化后的代码: ```java public void druglibUpdateFor20230530() throws UpdateException { final String jdbcDriver = "com.mysql.cj.jdbc.Driver"; final String dbUrl = DB_URL + "/" + DatabaseEnum.D_DRUG_LIB.getName() + "?useSSL=false"; final String dataSetTransfer = "insert " + DatabaseEnum.COMMON_BE.getName() + ".t_data_set select * from " + DatabaseEnum.D_DRUG_LIB.getName() + ".t_data_set"; final String treatmentTransfer = "insert " + DatabaseEnum.COMMON_BE.getName() + ".t_treatment select * from " + DatabaseEnum.D_DRUG_LIB.getName() + ".t_treatment"; final String dropDrugLib = "drop database " + DatabaseEnum.D_DRUG_LIB.getName(); try (Connection conn = DriverManager.getConnection(dbUrl, USER, PASS); Statement stmt = conn.createStatement()) { Class.forName(jdbcDriver); conn.setAutoCommit(false); stmt.executeUpdate(dataSetTransfer); if (Boolean.TRUE.equals(judgeTableExists("t_treatment", stmt))) { stmt.executeUpdate(treatmentTransfer); } stmt.executeUpdate(dropDrugLib); log.info("一体化drug_lib库数据迁移完成"); } catch (ClassNotFoundException | SQLException e) { throw new UpdateException(e.getMessage()); } } ``` 请注意,上述优化只是基于给出的代码段,可能还有其他地方可以进行优化。如果你有其他问题或需要进一步的优化建议,请随时告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值