我用Android Studio开发app,自己写接口,需要使用json,于是涉及到Json的使用,然而在使用过程中也踩到了不少坑。
1、JSONObject 包的引用。
一种是:
import org.json.JSONObject;
但是引用之后,发现网上有的代码为
JSONObject.fromObject(result);
而这个包里是没有fromObject以及一些其他方法的。
后来上网去查找,发现他们用的是另外一个包。下面讲的主要是这个包
我们使用的是
import net.sf.json.JSONObject;
这个需要依赖以下的几个包:
commons-beanutils-1.8.0.jar、commons-collections、commons-lang-2.4、commons-logging-1.1、ezmorph-1.0.4、json-lib-2.3-jdk15
都需要添加到Android Studio的 Lib中,一个都不能少。
接下来我去网上下载了几个版本的jar包,那些
2、问题一:一口气将这几个包同时复制到lib目录中,然后“add as library”,编译后发现某些包有问题,编译不同。(问题没有截图)
后来定位到项目中的目录,发现有个别jar包居然为0kb!坑爹,删除后重新复制一遍进去。解决问题。
3、我原本在网上下载的某个包为:commons-beanutils-1.8.0.jar
再添加进去的时候,编译报错。
Duplicate class org.apache.commons.collections.ArrayStack found in modules commons-beanutils-1.8.0.jar (commons-beanutils-1.8.0.jar) and commons-collections.jar (commons-collections.jar)
大意是org.apache.commons.collections.ArrayStack这个方法在 (commons-collections.jar)和(commons-beanutils-1.8.0.jar)中重复了。
于是试着把commons-beanutils-1.8.0.jar给删除了,程序就能运行不报错了。如执行以下代码都没有问题
JSONObject json = new JSONObject();
json.put("userName", userName);
json.put("password", password);
但是在执行到这个操作的时候,又报错了。
JSONObject jsonObject = JSONObject.fromObject(result);
boolean isError = jsonObject.getBoolean("successs");
错误为:
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/commons/beanutils/DynaBean;
到此,看到“beanutils”,我是明白了,因为我刚刚删除了commons-beanutils-1.8.0.jar的原因。
看来那几个依赖包,一个都不能少!
那之所以之前没删除之前,仍旧出现编译错误的原因,就只可能是依赖包的版本不一致了!
下载的时候说“(完整直接可用版)”和“所需全部JAR包”都是骗人的!!我那个伤心啊!折腾了那么久。
于是我意外发现了 commons-beanutils的官网,抱着试试的态度,下载了最新版的commons-beanutils-1.9.3.jar。引入项目后,完美解决!!!
我那个泪流满面啊!
以下为自己整理的JSONObject以及其依赖包的下载地址: