kotlin 引用fastjson 调用JSON.parseObject报“default constructor not found”错误解决方式

使用kotlin语言,引入fastjson库,调用JSON.parseObject()函数,结果报了"default constructor not found"的错误。



提示是没有default构造函数,查看DownloadEventMsgDto类,是写了一个无参数的构造函数的:



上网查资料,解决方式是使用版本低一些fastjson,我现在用的是1.2.46,将其改为1.2.32,问题解决。

kotlin如何使用1.2.46?

加入以下依赖,修改一下类的构造函数即可。

 <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-reflect</artifactId>
            <version>1.3.31</version>
        </dependency>
data class DownloadEventMsgDto(var id: Int, var filePathAndName: String) {
}

怎么解决的

进入fastjson1.2.46的源码,通过dubug打断点,首先我发现了它寻找构造函数的第一步是先找有@JSONCreator的构造函数,找不到则采用第二种方法找,在用第二种方法找时,会进入TypeUtils的getKotlinConstructorParameters()函数,这个函数会寻找"kotlin.reflect.jvm.internal.KClassImpl"类,找不到则会返回null,然后报没有构造函数的错误。


于是我就给构造函数加上了@JSONCreator的注解

@JSONCreator constructor() : this(0, "") {
    }

再运行时报了空指针异常



再次打断点观察,又是在TypeUtils的getKotlinConstructorParameters()函数寻找"kotlin.reflect.jvm.internal.KClassImpl"类,找不到则返回null。
去网上查kotlin.reflect.jvm.internal.KClassImpl相关资料,发现这是kotlin的一个反射库,需要自己引入,于是搜索 "kotlin-reflect maven"第一个内容就是maven仓库的网站。

其实这个问题如果报"找不到kotlin.reflect.jvm.internal.KClassImpl"的错误会好解决的多。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。