Java构造与解析Json数据

本文详细介绍了使用Java进行JSON转换过程中可能遇到的各种问题及解决方案,包括缺少必要的库文件导致的错误,如commons-lang-2.6.jar、commons-logging-1.1.1.jar等,并逐步演示如何解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当你看到下面的代码时,肯定想情不自禁的用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 more

EZMorph是用来转换对象的,它是一个简单的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-collectionsjar包里,与普通的map相比,ListOrderedMapkey可保持原有顺序,在某些情况比如做报表的时候,非常实用

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包可以百度搜索,记住在优快云中下载!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值