当你看到下面的代码时,肯定想情不自禁的用Myeclipse试一下,不过,你试了会报错...
package testNick;
import java.util.ArrayList;import java.util.List;
import net.sf.json.JSONArray;
public class HelloWorld {
public static void main(String[] args) {
/**List集合转换为json方法*/
List<String> list = new ArrayList<String>();
list.add("Jack");
list.add("Rose");
System.out.println(list);//[Jack, Rose]
JSONArray json1 = JSONArray.fromObject(list);
System.out.println(json1.toString());//["Jack","Rose"]
json1.add("Lucy");
System.out.println(json1.toString());//["Jack","Rose","Lucy"]
}
}
下面我就来讲解一下,报错的情况,给正在学习Json的朋友,一点帮助!
1、首先,A.用到Json,第一反应就想着要导入json-lib-2.4-jdk15.jar包,这里的jar包,因版本不同,可以不同。
运行会报错:
Exception in thread "main"java.lang.NoClassDefFoundError:org/apache/commons/lang/exception/NestableRuntimeException
atjava.lang.ClassLoader.defineClass1(Native Method)
atjava.lang.ClassLoader.defineClass(ClassLoader.java:621)
atjava.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
atjava.net.URLClassLoader.defineClass(URLClassLoader.java:260)
atjava.net.URLClassLoader.access$000(URLClassLoader.java:56)
atjava.net.URLClassLoader$1.run(URLClassLoader.java:195)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:252)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
attestNick.HelloWorld.main(HelloWorld.java:20)
Caused by: java.lang.ClassNotFoundException:org.apache.commons.lang.exception.NestableRuntimeException
atjava.net.URLClassLoader$1.run(URLClassLoader.java:200)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:252)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 13more
这个错提示我们缺少:commons-lang-2.6.jar包,因为它找不到这个类: NestableRuntimeException,必须是这个版本的jar包,如果是commons-lang-3.0.jar的话,还是会报这个错。这个异常阅读源码发现,继承RuntimeException类又实现Nestable接口:
public class NestableRuntimeException extends RuntimeException implements Nestable
然而,Nestable又实现Throwable接口
我大致猜测了一下,如果,转换失败,底层会出现错误信息:String msg
继而引发了这个NestableRuntimeException的发生!
B.当我们添加了“commons-lang-2.6.jar”包之后,上面的问题得到了解决,又会报一个错:
Exception in thread "main"java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
atnet.sf.json.AbstractJSON.<clinit>(AbstractJSON.java:53)
attestNick.HelloWorld.main(HelloWorld.java:17)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
atjava.net.URLClassLoader$1.run(URLClassLoader.java:200)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:252)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 2more
LogFactory来自common-logging包。如果用LogFactory.getLog,你可以用任何实现了通用日志接口的日志记录器替换log4j,而程序不受影响。apache的common-logging包是通用日志接口,通过这个中间层,你可以随便指定到底用哪个日志系统。增加系统的灵活性。若log4j它不存在, commons-logging 会另行选择其它的日志实现类。 这样保证了程序中不一定要使用log4j这个日志文件了 增强灵活性的理由: 1)首先在 classpath 下寻找自己的配置文件 commons-logging.properties ,如果找到,则使用其中定义的 Log 实现类; 2) 如果找不到 commons-logging.properties 文件,则在查找是否已定义系统环境变量 org.apache.commons.logging.Log ,找到则使用其定义的 Log 实现类; 3) 否则,查看 classpath 中是否有 Log4j 的包,如果发现,则自动使用 Log4j 作为日志实现类; 4) 否则,使用 JDK 自身的日志实现类( JDK1.4 以后才有日志实现类); 5) 否则,使用 commons-logging 自己提供的一个简单的日志实现类 SimpleLog ;commons-logging 仅仅对 Log4j( 当然还包括其它 LOG 实现 ) 作了一层包装,具体的日志输出还是在内部转交给身后的 Log4j 来处理,还有log4j会默认的去classes目录下去寻找log4j.properties 文件C.当我们添加了“commons-logging-1.1.1.jar”包之后,上面的问题得到了解决,又会报一个错:
Exception in thread "main"java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher
atnet.sf.json.util.CycleDetectionStrategy.<clinit>(CycleDetectionStrategy.java:37)
atnet.sf.json.JsonConfig.<clinit>(JsonConfig.java:65)
atnet.sf.json.JSONArray.fromObject(JSONArray.java:105)
attestNick.HelloWorld.main(HelloWorld.java:17)
Caused by: java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher
atjava.net.URLClassLoader$1.run(URLClassLoader.java:200)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:252)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 4 moreEZMorph是用来转换对象的,它是一个简单的Java类库,用于将一种对象转换成另外一种对象。
D.当我们添加了“ezmorph.jar”包之后,上面的问题得到了解决,又会报一个错:
Exception in thread "main"java.lang.NoClassDefFoundError:org/apache/commons/collections/map/ListOrderedMap
atnet.sf.json.JSONObject.<init>(JSONObject.java:1450)
atnet.sf.json.util.CycleDetectionStrategy.<clinit>(CycleDetectionStrategy.java:37)
atnet.sf.json.JsonConfig.<clinit>(JsonConfig.java:65)
atnet.sf.json.JSONArray.fromObject(JSONArray.java:105)
attestNick.HelloWorld.main(HelloWorld.java:17)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.map.ListOrderedMap
atjava.net.URLClassLoader$1.run(URLClassLoader.java:200)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:252)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 5more
ListOrderedMap位于commons-collections的jar包里,与普通的map相比,ListOrderedMap的key可保持原有顺序,在某些情况比如做报表的时候,非常实用
E.当我们添加了“commons-collections-3.2.1.jar”包之后,上面的问题得到了解决,又会报一个错:
该包是对Java容器类型和算法的补充,apache的集合包,比jdk自带的功能多一点。
Exception in thread "main" java.lang.NoClassDefFoundError:org/apache/commons/beanutils/DynaBean
atnet.sf.json.AbstractJSON._processValue(AbstractJSON.java:230)
atnet.sf.json.JSONArray._processValue(JSONArray.java:2513)
atnet.sf.json.JSONArray.processValue(JSONArray.java:2538)
atnet.sf.json.JSONArray.addValue(JSONArray.java:2525)
atnet.sf.json.JSONArray._fromCollection(JSONArray.java:1056)
atnet.sf.json.JSONArray.fromObject(JSONArray.java:123)
atnet.sf.json.JSONArray.fromObject(JSONArray.java:105)
attestNick.HelloWorld.main(HelloWorld.java:17)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.beanutils.DynaBean
atjava.net.URLClassLoader$1.run(URLClassLoader.java:200)
atjava.security.AccessController.doPrivileged(NativeMethod)
atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
atjava.lang.ClassLoader.loadClass(ClassLoader.java:252)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 8more
F.我们添加了“commons-beanutils-1.8.3.jar”包之后得到了解决!
beanutils通过反射机制转换数据!A.B.C.D.E.F.六个包导入完成,分别是:
commons-beanutils-1.8.3.jar
commons-collections-3.2.1.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar
ezmorph-1.0.6.jar
json-lib-2.4.jdk15.jar
报错结束,输出成功!
[Jack, Rose]
["Jack","Rose"]
["Jack","Rose","Lucy"]相应的jar包可以百度搜索,记住在优快云中下载!