适用于 Android 的 Moshi 库
Moshi,由 Square 开发的 JSON 库。 Moshi 使我们能够以更有效和更直接的方式序列化和反序列化 JSON。因此,在开始之前,让我们将文章分为以下几个部分。
- 为什么我们需要一个用于序列化和反序列化的 Android 库?
- 我们如何使用 Moshi?
- 莫氏的特点
- 将 Moshi 与 List 结合使用。
- 将 Moshi 与 Retrofit 结合使用
为什么我们需要一个用于序列化和反序列化的 Android 库?
当我们在 Android 中进行 API 调用时,我们几乎总是得到 JSON 作为响应。我们可以调用 JSON 并手动解析它以使用它,或者我们可以使用像 Moshi 这样的库来为我们序列化和反序列化它。使用 Moshi 可以帮助我们减少编写的行数和出错的可能性。
我们如何使用 Moshi?
本节将解释我们将如何与 Moshi 合作。假设我们有一个名为 GFG 的数据类。
data class GFG(val courseName: String, val coursePrice: Int)
假设我们有一个名为 user 的变量,定义为:
val gfg= GFG("Spandan", "connectwithspandan@gmail.com")
我们现在将在 Moshi 的帮助下将其转换为 JSON 结构。我们有一个 JsonAdapter 类和一个构建器模式来与 Moshi 一起工作。因此,我们构建了 Moshi:
Kotlin
val gfgMoshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
Kotlin
data class GFG(val courseName:CName)
Kotlin
class CourseAdapter { }
Kotlin
class GFGUserAdapter {
@ToJson
fun fullGFGUser(GFGUser: GFGUser): String {
}
@FromJson
fun getIndividualGFGUsers(json: String): GFGUser {
}
}
Kotlin
@FromJson
fun getIndividualGFGUsers(fullGFGUser: String): GFGUser {
val GFGUser = fullGFGUser.split(" ")
return GFGUser(GFGUser[0], GFGUser[1])
}
Kotlin
@JsonClass(generateAdapter = true)
data class GFG(val gfgName: Name, @EmailCheck val gfg: India?)
Kotlin
val gfgMpshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
在这种情况下,我们将 User 数据类作为我们想要执行操作的结构传递。现在,要将 User 类的对象转换为 JSON,我们使用
someJsonAdap.toJson(gfg)
Moshi 的特点 Moshi 默认支持几乎所有的数据类型,例如:
- 整数、浮点数等
- 集合和数组
- 字符串、枚举
除了上述类型之外,我们还可以在 Moshi 中创建自己的类型。让我们用一个例子来说明这一点。
科特林
data class GFG(val courseName:CName)
我们在 Name 类中采用两个参数,分别称为 firstName 和 lastName。现在,当我们从此类中获取 JSON 时,我们想要用户的全名,例如 firstName + lastName。我们可以在每次解析 JSON 时手动完成,或者添加我们自己的适配器并让 Moshi 为我们完成。因此,我们将创建一个名为 NameAdapter 的类。
科特林
class CourseAdapter { }
我们将在这个类中进行转换。我们将添加两个新函数:fun fullName() 和 fun getIndividualNames()。该课程现在似乎是:
科特林
class GFGUserAdapter {
@ToJson
fun fullGFGUser(GFGUser: GFGUser): String {
}
@FromJson
fun getIndividualGFGUsers(json: String): GFGUser {
}
}
在这种情况下,我们使用 ToJson 注释了 fullName 并使用 FromJson 注释了 getIndividualNames。这意味着当您将此适配器与 Moshi 一起使用时,Moshi 将搜索注解。假设我们想要连接名字和姓氏以返回 JSON 格式的全名;我们将在使用 ToJson 注释的 fullName函数中执行此操作。同样,由于我们为 JSON 解析添加了 ToJson 转换,因此我们需要更新 getIndividualNames函数,该函数使用 FromJson 进行注释,并且在将 JSON 映射到类时会将 JSON 值转换为 Name 数据类中的单个元素。
科特林
@FromJson
fun getIndividualGFGUsers(fullGFGUser: String): GFGUser {
val GFGUser = fullGFGUser.split(" ")
return GFGUser(GFGUser[0], GFGUser[1])
}
在这种情况下,我们将字符串fullName 从第一个空格中拆分出来,以获取字符串列表中的名字和姓氏两个字符串。
Geektip: Please keep in mind that Moshi’s adapters are ordered by precedence, so you should always add the Kotlin adapter after your own custom adapters. Otherwise, the KotlinJsonAdapterFactory will be invoked and your custom adapters will be ignored.
科特林
@JsonClass(generateAdapter = true)
data class GFG(val gfgName: Name, @EmailCheck val gfg: India?)
如您所见,我们使用 EmailCheck 对电子邮件进行了注释,这意味着如果所有 EmailCheck 注释都存在,则检查仅适用于电子邮件字段。 Name 类保持不变
将 Moshi 与 List 结合使用
在本节中,我们将学习如何将 List 转换为 String,然后将 String 转换为 List。考虑以下场景:我们从服务器接收对象列表,需要将其存储在应用程序的共享首选项中。我们想将对象列表转换为字符串,因为它只保存原始数据类型,我们会在需要时将其转换回列表。
科特林
val gfgMpshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()