毫无疑问,人们正在远离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