从Gson到Moshi,我学到的东西
#json #android #pojo

毫无疑问,人们正在远离Gson,我同意those reasons too。 GSON比其他解析库具有的唯一优势是,设置需要很短的时间。此外,最重要的是Moshi拥抱Kotlin支持。

首先,让我们实现依赖性:

implementation("com.squareup.moshi:moshi:1.8.0")

迁移到Moshi并不是一件艰难的事情。真的是Gson的样子。唯一要做的就是用@field:json而不是@SerializedName注释对象(这是用于JS表示的GSONS):

data class User( //GSON way
  @SerializedName("name")
  val name: String,
  @SerializedName("user_name")
  val userName: String,
  @SerializedName("last_name")
  val lastName: String,
  @SerializedName("email")
  val email: String
)

data class User( //Moshi way
  @field:Json(name = "name")
  val name: String,
  @field:Json(name = "user_name")
  val userName: String,
  @field:Json(name = "last_name")
  val lastName: String,
  @field:Json(name = "email")
  val email: String
)

显然,为了解决我们已经解决的问题,但我们还没有释放全部力量。请记住,这样,我们还没有实施Kotlin支持。这样,Moshi附带了一些新的依赖性和用于生成适配器的注释处理器。有关更多信息,请参阅docs

implementation("com.squareup.retrofit2:converter-moshi:2.4.0") //needed for retrofit integration when parsing
implementation("com.squareup.moshi:moshi:1.8.0") //core library
implementation("com.squareup.moshi:moshi-kotlin:1.6.0") //kotlin support
kapt("com.squareup.moshi:moshi-kotlin-codegen:1.8.0") // annotation processor, should have apply plugin: 'kotlin-kapt' above

默认值
在Java中,我们有瞬态关键字以使用Moshi的可选值,而在Kotlin中,这是通过@Transient注释来实现的:

@Entity(tableName = "some_table_name")
@JsonClass(generateAdapter = true)
data class SomeEntity(
 @ColumnInfo(name = "some_id")
 @PrimaryKey(autoGenerate = true)
 @Transient
 //I need this field for my Room as an entity but definitely nothing is comming from the server. Mandatory to have a default value for Moshi
 val id: Int = 0,

    @Json(name = "audio")
    @ColumnInfo(name = "audio_url")
    val audioUrl: String,

    @Json(name = "text")
    @ColumnInfo(name = "text")
    val text: String,

)

如果您注意到更多,@field:JSON现在只是一个@json。我们已经用@jsonClass注释了课程,这有助于将班级编码为JSON格式

结论
如果您跳过了从GSON迁移到Moshi的原因,我会提供自己的理由
- 速度(即使在调试模式下,我也立即注意到了)。
-Kotlin支持。
- Proguard规则:如果您仅选择Java版本的Moshi,则您不需要任何主持人规则才能发布。

另一种选择。
如果您发现不喜欢Moshi的原因,建议您看看Kotlinx Serialization。 IMO,使用它有点太早了,但是它肯定看起来很有希望。

Stavro Xhardha