fastjson在kotlin不使用kotlin-reflect库怎么使用?

原文地址:https://blog.raoyunsoft.com/post/23

现象

我在Android上使用fastjson解析kotlin类的时候出现报错

val model = JSON.parseObject(json, InvitationHistoryModel::class.java)

报错default constructor not found

java 复制代码
default constructor not found .InvitationHistoryModel
com.alibaba.fastjson.JSONException: default constructor not found .InvitationHistoryModel
at app//com.alibaba.fastjson.parser.JavaBeanInfo.build(JavaBeanInfo.java:502)
at app//com.alibaba.fastjson.parser.JavaBeanDeserializer.<init>(JavaBeanDeserializer.java:37)
at app//com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:363)

我的写法

kotlin 复制代码
@Keep
data class InvitationHistoryModel(
    @JSONField(name = "creditsEarned")
    val creditsEarned: Int = 0,
    
    @JSONField(name = "invitations")
    val invitations: Int = 0,
    
    @JSONField(name = "history")
    val history: List<InvitationHistoryRecord> = emptyList()
) {
    /**
     * 检查是否有邀请记录
     * @return true表示有邀请记录,false表示没有
     */
    fun hasInvitations(): Boolean {
        return history.isNotEmpty()
    }
}

但是我反编译之后是有默认构造函数的,奇怪

不好的解决方案

找了一圈资料发现需要添加kotlin反射依赖

implementation("org.jetbrains.kotlin:kotlin-reflect:1.9.25")

但是这个库的jar有3.3M 实际APK会增加0.7M,这...包大小过不了啊,会被喷死

最终解决方案:

添加@JSONCreator constructor,并且把参数由val改成var可解决,还要注意加@Keep注解防止被混淆

如下:

kotlin 复制代码
@Keep
data class InvitationHistoryModel @JSONCreator constructor(
    @JSONField(name = "creditsEarned")
    var creditsEarned: Int = 0,

    @JSONField(name = "invitations")
    var invitations: Int = 0,

    @JSONField(name = "history")
    var history: List<InvitationHistoryRecord> = emptyList()
) {

    /**
     * 检查是否有邀请记录
     * @return true表示有邀请记录,false表示没有
     */
    fun hasInvitations(): Boolean {
        return history.isNotEmpty()
    }
}
相关推荐
studyForMokey12 分钟前
【Android面试】View绘制流程专题
android·面试·职场和发展
wertyuytrewm23 分钟前
Java 异常|Java Exceptions
java·开发语言
雪碧聊技术31 分钟前
深入理解 Java GC:从“房间清洁工”到解决系统卡顿实战
java·开发语言
大鹏说大话37 分钟前
Java并发编程核心:线程安全、synchronized与volatile的深度剖析
java·开发语言
JAVA+C语言41 分钟前
Java IO 流
java·开发语言
酉鬼女又兒1 小时前
零基础快速入门前端CSS Transform 与动画核心知识点及蓝桥杯 Web 应用开发考点解析(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·css·职场和发展·蓝桥杯·html
山川行1 小时前
Python快速闯关8:内置函数
java·开发语言·前端·笔记·python·学习·visual studio
charlie1145141911 小时前
嵌入式C++教程实战之Linux下的单片机编程:从零搭建 STM32 开发工具链(2) —— HAL 库获取、启动文件坑位与目录搭建
linux·开发语言·c++·stm32·单片机·学习·嵌入式
Java基基1 小时前
sdkman 一键切换 JDK 版本管理工具
java·开发语言·sdkman
春日见1 小时前
GIT操作大全(个人开发与公司开发)
开发语言·驱动开发·git·matlab·docker·计算机外设·个人开发