本文转载自http://chriszz.sinaapp.com/?p=392
Json就是Javascript notation,可以替代XML,用做数据交互。
Json的两种基本表示形式,可以用自动机表示:
*********************************************************************************
在Java中可以使用json-lib的相关包来解析Json数据。Google到的结果表明,我们需要如下6个包:
json-lib本身:
json-lib-2.4-jdk15
依赖包:
jakarta commons-lang 2.5
jakarta commons-beanutils 1.8.0
jakarta commons-collections 3.2.1
jakarta commons-logging 1.1.1
ezmorph 1.0.6
这时候,我们建立一个Java工程来测试,其中只有一个Java文件JsonLibTest.java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package chris.json; import net.sf.json.JSONArray; public class JsonLibTest { public void testArrayToJSON(){ boolean [] boolArray = new boolean []{ true , false , true }; JSONArray jsonArray = JSONArray.fromObject(boolArray); System.out.println(jsonArray); } public static void main(String[] args){ boolean [] boolArray = new boolean []{ true , false , true }; JSONArray jsonArray = JSONArray.fromObject(boolArray); System.out.println(jsonArray); } |
然后在工程中新建一个lib文件夹,把上面6个包下载后复制到lib文件夹中,并全部选中,设定为"add to build path",然后运行,等待我们的是一段恶心的报错:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java: 631 ) at java.lang.ClassLoader.defineClass(ClassLoader.java: 615 ) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java: 141 ) at java.net.URLClassLoader.defineClass(URLClassLoader.java: 283 ) at java.net.URLClassLoader.access$ 000 (URLClassLoader.java: 58 ) at java.net.URLClassLoader$ 1 .run(URLClassLoader.java: 197 ) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java: 190 ) at java.lang.ClassLoader.loadClass(ClassLoader.java: 306 ) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java: 301 ) at java.lang.ClassLoader.loadClass(ClassLoader.java: 247 ) at chris.json.JsonLibTest.main(JsonLibTest.java: 15 ) Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException at java.net.URLClassLoader$ 1 .run(URLClassLoader.java: 202 ) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java: 190 ) at java.lang.ClassLoader.loadClass(ClassLoader.java: 306 ) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java: 301 ) at java.lang.ClassLoader.loadClass(ClassLoader.java: 247 ) ... 13 more |
然后依旧到Google上搜索,有人说是缺少包(显然不是,我们这里有6个包),stackoverflow上的回答也什么都没说清楚。
仔细看了下错误的第一行,说的是org/apache/commons/lang/exception/NestableRuntimeException这个类没有找到,然后到commons-lang-2.5-bin.zip包里面寻找这个类,发现有这个类啊,为什么还是报错?索性把commons-lang-2.5-bin.zip包解压,把里面的commons-lang-2.5.jar复制出来,替换工程中lib目录下的commons-lang-2.5-bin.zip。再次运行,虽然还是报错,但是不报原来的错误了,说明原有错误解决了。索性把所有的zip包都解了压,抽取jar(但不包括javadoc、sources、adapters的jar包),替换lib目录下的zip包,然后重新config build path,代码可以运行了!
所以,结论是:Eclpse导入zip格式的包时可能出现问题,最好还是导入jar包! 当然,关于需要什么版本的包,还是到官网上去看看,网上博客里面的教程一般都不会去更新的。。
为了方便,我把这6个jar包放在一起了,可以到网盘下载