📜  适用于 Android 的 Moshi 库

📅  最后修改于: 2022-05-13 01:58:45.037000             🧑  作者: Mango

适用于 Android 的 Moshi 库

Moshi,由 Square 开发的 JSON 库。 Moshi 使我们能够以更有效和更直接的方式序列化和反序列化 JSON。因此,在开始之前,让我们将文章分为以下几个部分。

  1. 为什么我们需要一个用于序列化和反序列化的 Android 库?
  2. 我们如何使用 Moshi?
  3. 莫氏的特点
  4. 将 Moshi 与 List 结合使用。
  5. 将 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 默认支持几乎所有的数据类型,例如:

  1. 整数、浮点数等
  2. 集合和数组
  3. 字符串、枚举

除了上述类型之外,我们还可以在 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 从第一个空格中拆分出来,以获取字符串列表中的名字和姓氏两个字符串。

科特林

@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()