Kotlin 使用Gson、Moshi、KotlinSerialization转换json的区别

本文对比了Google的Gson、Square的Moshi和Kotlin官方的KotlinSerialization在处理JSON转换时的差异。通过四个测试用例,分析了参数空缺、多余参数、null值以及无默认值情况下,这三种库的表现。测试结果显示,Gson在Java层面较为稳定,但在处理Kotlin的非空特性和空类型时存在问题。Moshi和KotlinSerialization则能更好地识别Kotlin的特点,但可能需要处理异常。讨论了如何优化这些库的使用方式,并邀请读者分享更好的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介: Gson是google出的,Moshi是square出的,KotlinSerializatin(以下简称KS)是kotlin官方的。

测试用数据类

    @JsonClass(generateAdapter = true) //这个注解是moshi用
    @Serializable                       //这个注解KS用
    data class User(
            val age :Int=11,
            val name :String= "lucy"
    )
复制代码

测试代码

        // Moshi
        try {
            val moshi = Moshi.Builder().build()
            val user1 = moshi.adapter(User::class.java).fromJson(json)
            Log.d("moshi",user1.toString())
        } catch (e: Exception) {
            Log.e("moshi",e.message)
        }
        // Gson
        try {
            val user2 = Gson().fromJson(json, User::class.java)
            Log.d("Gson", user2.toString())
        } catch (e: Exception) {
            Log.e("Gson",e.message)
        }
        // KS
        try {
            val userJson = Json.parse(User.serializer(), json)
            Log.d("KS",userJson.toString())
        } catch (e: Exception) {
            Log.e("KS",e.message)
        }
复制代码

1. 测试一,参数空缺时,三家的处理。测试json为

 val json = """
            {

            }
        """.trimIndent()
复制代码

结果:

MoshiGson可以正常解析,并且可以将默认值赋值,KS抛了个参数缺失的异常。。

2.测试二,多给了些数据类没有定义的参数

val json = """
            {
                "name":"tom",
                "isFemale":false,
                "age":24
            }
        """.trimIndent()
复制代码

结果:

KS报了个未知key,但可以取消严格模式来过滤。在改为val userJson = Json.nonstrict.parse(User.serializer(), json)后,三家都能正常解析。

3. 测试三,从测试一得知,不给参数是可以正常拿到默认值的,那么给定null呢?

val json = """
            {
                "name":null
            }
        """.trimIndent()
复制代码

结果:

三家都有点问题。 moshiKS一样,都能认得出来kotlin有定义了namenotnull的,json给定了null都报错了,Gson看起来是正常解析的,但是它没有认出kotlin的非空定义。

4.测试四 上述用例中User都是用默认值的,现在我们去除掉

data class User(
            val age :Int,
            val name :String
    )
复制代码

给一个空串去解析,理所当然的,moshi和KS都报错了,Gson能正常解析,然而与测试一不同,同样是空串去解析,这次Gson并没有拿到默认值。

从结果来看,Gson还是比较稳的,至少在java层面来说,它没有太大问题。只是在对kotlin的支持不够。一个是空类型认不出;一个是它只取空构造去创建对象,kotlin在每个构造参数都有默认值的时候,会有空构造函数,然后会调用带参构造将默认值初始化,所以Gson能够正常解析。但如果没有默认值的时候,kotlin生成的字节码中是没有空构造的,此时Gson就拿不到默认值了。而moshi和ks能够认出kotlin的一些特点,但是区区一个解析json都要我去处理异常,我是不高兴的。。

设置成所有参数都可空,且给一个默认值,那么moshi和Gson就都没有问题了。但是这样就放弃了kotlin的非空特性

谁的好的方法,比如过滤掉Gson对null的赋值,欢迎留言。

转载于:https://juejin.im/post/5ccafeab6fb9a0323a01c3d4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值