kotlin使用com.alibaba.fastjson.JSONException: default constructor not found
2017-08-26 16:09
1916 查看
使用kotlin,在用fastjson来解析json数据时,出现这个错误
目前fastjson最新版本是1.1.62,不过还不稳定,出现这个问题建议使用1.1.61
github地址:https://github.com/ttarfall/fastjson
目前这个错误在使用kotlin的data数据类和普通数据类都会有,解决方法:
使用1.1.61稳定版
无使用 普通数据类 并且像这样多增加一个空构造器
期待官网能尽快更新这个问题
那下边我们来源码分析一下出现这个错误的原因:(这里主要比较的1.1.61和1.1.62)
由于官网是从1.1.61开始兼容kotlin解析,之前版本如果解析出错正常,因为没兼容,可能会有莫名其妙的错误,哈哈~~~
我们的异常是从这个方法抛出的:
具体代码在1.1.62在这里判断
如果看过1.1.61的源码,这里唯一的区别就是多了一个kotlin的判断
在1.1.61直接没有这个判断,执行该判断内容创建constructor,但是这个是java代码,kotlin的数据data类默认是没有空的构造器,Java会为我们默认生成一个constructor,所以kotlin这里使用1.1.61要默认添加一个构造器
那为什么1.1.62执行else方法有没有成功呢?还是上源代码
关键方法
在判断kotlin_kclass_constructor为空的时候要去创建一个,关键代码:
细心的朋友可以发现这里通过反射区创建,结构就抛出了异常,是因为找不到这个类
我也是醉了,期待官网尽快更新了,我用的kotlin1.1.4确实找不到这个实现类
目前fastjson最新版本是1.1.62,不过还不稳定,出现这个问题建议使用1.1.61
github地址:https://github.com/ttarfall/fastjson
目前这个错误在使用kotlin的data数据类和普通数据类都会有,解决方法:
使用1.1.61稳定版
无使用 普通数据类 并且像这样多增加一个空构造器
class UserInfo{ constructor() constructor(email: String, id: String, name: String) }
期待官网能尽快更新这个问题
那下边我们来源码分析一下出现这个错误的原因:(这里主要比较的1.1.61和1.1.62)
由于官网是从1.1.61开始兼容kotlin解析,之前版本如果解析出错正常,因为没兼容,可能会有莫名其妙的错误,哈哈~~~
我们的异常是从这个方法抛出的:
public static JavaBeanInfo build(Class<?> clazz, // int classModifiers, // Type type, // boolean fieldOnly, // boolean jsonTypeSupport, // boolean jsonFieldSupport, // boolean fieldGenericSupport, // PropertyNamingStrategy propertyNamingStrategy )
具体代码在1.1.62在这里判断
if ((classModifiers & Modifier.ABSTRACT) == 0 && !kotlin) {
如果看过1.1.61的源码,这里唯一的区别就是多了一个kotlin的判断
在1.1.61直接没有这个判断,执行该判断内容创建constructor,但是这个是java代码,kotlin的数据data类默认是没有空的构造器,Java会为我们默认生成一个constructor,所以kotlin这里使用1.1.61要默认添加一个构造器
那为什么1.1.62执行else方法有没有成功呢?还是上源代码
关键方法
public static String[] getKoltinConstructorParameters(Class clazz)
在判断kotlin_kclass_constructor为空的时候要去创建一个,关键代码:
try { Class class_kotlin_kclass = Class.forName("kotlin.reflect.jvm.internal.KClassImpl"); kotlin_kclass_constructor = class_kotlin_kclass.getConstructor(Class.class); kotlin_kclass_getConstructors = class_kotlin_kclass.getMethod("getConstructors"); Class class_kotlin_kfunction = Class.forName("kotlin.reflect.KFunction"); kotlin_kfunction_getParameters = class_kotlin_kfunction.getMethod("getParameters"); Class class_kotlinn_kparameter = Class.forName("kotlin.reflect.KParameter"); kotlin_kparameter_getName = class_kotlinn_kparameter.getMethod("getName"); } catch (Throwable e) { kotlin_class_klass_error = true; }
细心的朋友可以发现这里通过反射区创建,结构就抛出了异常,是因为找不到这个类
kotlin.reflect.jvm.internal.KClassImpl
我也是醉了,期待官网尽快更新了,我用的kotlin1.1.4确实找不到这个实现类
相关文章推荐
- Kotlin - com.alibaba.fastjson.JSONException: default constructor not found
- com.alibaba.fastjson.JSONException: default constructor not found. class com.anerfa.axdblue_code.ho
- com.alibaba.fastjson.JSONException: default constructor not found. class ……
- java.lang.ClassNotFoundException: com.alibaba.fastjson.JSON
- Android开发fastjson错误:JSONException: default constructor not found. class com.xx...
- Caused by: java.lang.ClassNotFoundException: com.alibaba.fastjson.JSONObject
- com.alibaba.fastjson.JSONException: not close json text, token : error
- fastjson混淆后default constructor not found.
- 解决com.alibaba.fastjson.JSONException: autoType is not support
- com.alibaba.fastjson.JSONException: not close json text, token : :
- Exception in thread "main" com.alibaba.fastjson.JSONException: autoType is not support. com.accord.f
- com.alibaba.fastjson.JSONException: not close json text, token : error
- kotlin fastjson:defalut constructor not found
- 解决 com.alibaba.fastjson.JSONException: autoType is not support.
- java链接MySQL数据库时使用com.mysql.jdbc.Connection的包会出红线问题 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver问题
- com.alibaba.fastjson.JSONException: syntax error, expect {, actual int, pos 0
- 使用zxing识别二维码时抛出com.google.zxing.NotFoundException异常问题的解决
- json转list遇到的坑 com.alibaba.fastjson.JSONException: unclosed string : w
- com.alibaba.fastjson.JSONException: exepct '[', but {, type : class com.lvche.pocketscore.bean2.Room
- com.alibaba.fastjson.JSONException: syntax error, expect {, actual int, pos 0