资讯专栏INFORMATION COLUMN

Android 使用fastjson找不到fastjson包问题的解决方法

hiYoHoo / 2148人阅读

摘要:但是将导入工程后,在使用时会出现等错误消息。初步认为是与自带的冲突。再运行工程,这个错误不再出现了,奇迹般的没问题了。我的理解是这样,不知道对不对,欢迎大侠指正。工程中下默认的是,而则应该是。所以按照该文的解决方法,更改就好了。

JSON解析库有很多,诸如Jackson,Json-lib,org.json,Gson和fastjson等,但是fastjson以其解析速度最快而脱颖而出。详细的测试地址如下:
https://github.com/eishay/jvm-serializers/wiki/Staging-Results
fastjson是国内alibaba公司的wenshao开发的,项目Git地址:
https://github.com/alibaba/fastjson

今天测试了下发现fastjson挺好用,比Android自带的org.json库要好用多了。当然我没有对fastjson的性能进行测试,只是因为Android自带的不太好。
在普通的java项目下,只需要导入fastjson.jar就可以,无需依赖其他包,这一点相比json-lib要好多,json-lib依赖五六个包。但是将fastjson.jar导入Android工程后,在使用时会出现 java.lang.NoClassDefFoundError:can"t find com.alibaba.fastjson.JSON等错误消息。

初步认为是与Android自带的org.json冲突。于是Build Path->Configure Build Path->Order And Export下将fastjson.jar上调至Android xx.jar上(xx为android 版本号)。再运行工程,这个错误不再出现了,奇迹般的没问题了。

然后现在再调整fastjson.jar和Android.jar顺序也不会出现can"t not find com.alibaba.fastjson的错误,不知道为何,继续看。

文章Java虚拟机类加载顺序讲解了java 虚拟机加载class和jar包的顺序。
bootstrap classloader ->extension classloader->system classloader
其中bootstrap引导类加载器;
extension classloader扩展类加载器,它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系统属性指定的)中JAR的类包;
system classloader系统(也称为应用)类加载器,它负责在JVM被启动时,加载来自在命令java中的-classpath或者java.class.path系统属性或者 CLASSPATH操作系统属性所指定的JAR类包和类路径.
该文中还有一句话是这么说的,应该能解决我们的疑惑:

“此外类加载还采用了cache机制,也就是如果 cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。”

我想应该是Android虚拟机中已经有了fastjson的cache了,所以导致如何更改项目的fastjson.jar和Android.jar顺序都不会有任何反应。我的理解是这样,不知道对不对,欢迎大侠指正。

解释到这里,也解决了我另外一个疑问,就是在Android的工程中新建一个java类,并生成main方法,然后Run->Java Application. 结果会出现如下的错误:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (classFileParser.cpp:3494), pid=5940, tid=5632
#  Error: ShouldNotReachHere()

这个问题的产生就是和bootstrap classloard 有关了,文件上右键Run As->Run Configuration选择Java Application下的这个Java类,然后选择右侧的Classpath标签页下有两个目录,分别是Bootstrap Entries 和 User Entries。
Android工程中Bootsrap下默认的是Android Classpath Container,而Java则应该是JRE System Library。所以按照该文Error: ShouldNotReachHere()的解决方法,更改就好了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64035.html

相关文章

  • fastjson转换json时,碰到那些首字母大小写转换坑!

    摘要:某年某月的某一天,本汪在某个奇葩的公司,接手了某个奇葩的项目,遇到了一些奇葩的事情,就掉进关于做转换时,那些关于首字符大小写的坑。坑首字符小写,第二个字符大写的键名这个坑与相关,严格来说,应该是挖的坑。 某年某月的某一天,本汪在某个奇葩的公司,接手了某个奇葩的项目,遇到了一些奇葩的事情,就掉进关于fastjson做bean to json转换时,那些关于首字符大小写的坑。 这个奇葩项目...

    tyheist 评论0 收藏0
  • fastjson 重复引用和循环引用问题

    数据传输使用json格式再方便不过了。fastjson 由阿里巴巴那伙人使用Java语言编写,号称最快的JSON库前两天遇到一个问题 后台的数据转化为json字符串后发送到前台出现了$ref字样的东西,后来明白了这是引用,在传输的数据中出现相同的对象时,fastjson默认开启引用检测将相同的对象写成引用的形式.说到引用分为两种,重复引用和循环引用 重复引用 指一个对象重复出现多次 循环引用 指你...

    zeyu 评论0 收藏0
  • JPA 一对多双向映射 结果对象相互迭代 造成堆栈溢出问题方法

    摘要:问题在双向映射时,会相互包含对方的实例,相互引用,造成递归迭代,堆栈溢出。分析在后端向前端传递的时候会将数据序列化,转为,这时会出现循环引用造成堆栈溢出解决方案解决方法就是在转换时忽略循环字段。 问题: JPA 在双向映射时,会相互包含对方的实例,相互引用,造成递归迭代,堆栈溢出(java.lang.StackOverflowError)。 分析: 在后端向前端传递的时候会将数据序列化...

    diabloneo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<