GSON 的 gson.fromJson() 和 gson.toJson() 的 Moshi 等价物是什么?
What is Moshi's Equivalent of GSON's gson.fromJson() and gson.toJson()?
我正在关注 ROOM tutorial and at some point 我们需要为 ROOM 创建类型转换器。 GSON 被用来解析 JSON.
为了实现这一点,我们首先创建这个通用接口,它包含 2 个函数,用于从 JSON 字符串获取对象或将对象解析为 JSON 字符串。如果您决定切换到不同的库来解析 JSON 字符串。
interface JsonParser {
//takes the actual JSON String and return an object of our type
fun <T> fromJson(json: String, type: Type): T?
//takes our object and return JSON String
fun <T> toJson(obj: T, type: Type): String?
}
下一步是在使用 GSON 的地方创建上述接口的实现。
//JsonParser implementation
class GsonParser (private val gson: Gson):JsonParser {
override fun <T> fromJson(json: String, type: Type): T? {
return gson.fromJson(json,type)
}
override fun <T> toJson(obj: T, type: Type): String? {
return gson.toJson(obj,type)
}
}
对于我的情况,我希望使用 Moshi 来做同样的事情。不幸的是,Moshi 没有 toJson()
或 fromJson()
方法。
已尝试寻找等效于 GSON 的 toJson()
和 fromJson()
的 Moshi 方法,但我什么也没得到。我该怎么做?
我仔细阅读了 Moshi Documentations provided by @CommonsWare 他上面的评论
解决方案是先将 Moshi/Retrofit
的依赖项添加到您的项目中。
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-moshi:2.9.0'
//Moshi Library Dependencies - Core Moshi JSON Library and Moshi's Kotlin support and converter factory
implementation "com.squareup.moshi:moshi:1.12.0"
implementation "com.squareup.moshi:moshi-kotlin:1.12.0"
然后创建一个实现JsonParser接口的class名称MoshiParser
并初始化Moshi
。为了让 Moshi 的注释在 Kotlin 中正常工作,您只需在 Moshi Builder 上添加 KotlinJsonAdapterFactory
。
下一项是使用 Moshi 的 JsonAdapter,它采用 <T>
的通用类型。 JsonAdpater 提供 JsonAdpater.toJson()
和 JsonAdapter.fromJson()
.
class MoshiParser() : JsonParser {
//initialize Moshi
private val moshi: Moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
override fun <T> fromJson(json: String, type: Type): T? {
//use jsonAdapter<T> for generic adapter
val jsonAdapter: JsonAdapter<T> = moshi.adapter(type)
return jsonAdapter.fromJson(json)
}
override fun <T> toJson(obj: T, type: Type): String? {
//use jsonAdapter<T> for generic adapter
val jsonAdapter: JsonAdapter<T> = moshi.adapter(type)
return jsonAdapter.toJson(obj)
}
}
这是我使用 Moshi 处理此问题的扩展
/*
* [Moshi] extension to transform an object to json
* */
inline fun <reified T> Moshi.objectToJson(data: T): String =
adapter(T::class.java).toJson(data)
/*
* [Moshi] extension to transform json to an object
* */
inline fun <reified T> Moshi.jsonToObject(json: String): T? =
adapter(T::class.java).fromJson(json)
您可以在此处找到更多要点 - Gist Link
我正在关注 ROOM tutorial and at some point 我们需要为 ROOM 创建类型转换器。 GSON 被用来解析 JSON.
为了实现这一点,我们首先创建这个通用接口,它包含 2 个函数,用于从 JSON 字符串获取对象或将对象解析为 JSON 字符串。如果您决定切换到不同的库来解析 JSON 字符串。
interface JsonParser {
//takes the actual JSON String and return an object of our type
fun <T> fromJson(json: String, type: Type): T?
//takes our object and return JSON String
fun <T> toJson(obj: T, type: Type): String?
}
下一步是在使用 GSON 的地方创建上述接口的实现。
//JsonParser implementation
class GsonParser (private val gson: Gson):JsonParser {
override fun <T> fromJson(json: String, type: Type): T? {
return gson.fromJson(json,type)
}
override fun <T> toJson(obj: T, type: Type): String? {
return gson.toJson(obj,type)
}
}
对于我的情况,我希望使用 Moshi 来做同样的事情。不幸的是,Moshi 没有 toJson()
或 fromJson()
方法。
已尝试寻找等效于 GSON 的 toJson()
和 fromJson()
的 Moshi 方法,但我什么也没得到。我该怎么做?
我仔细阅读了 Moshi Documentations provided by @CommonsWare 他上面的评论
解决方案是先将 Moshi/Retrofit
的依赖项添加到您的项目中。
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-moshi:2.9.0'
//Moshi Library Dependencies - Core Moshi JSON Library and Moshi's Kotlin support and converter factory
implementation "com.squareup.moshi:moshi:1.12.0"
implementation "com.squareup.moshi:moshi-kotlin:1.12.0"
然后创建一个实现JsonParser接口的class名称MoshiParser
并初始化Moshi
。为了让 Moshi 的注释在 Kotlin 中正常工作,您只需在 Moshi Builder 上添加 KotlinJsonAdapterFactory
。
下一项是使用 Moshi 的 JsonAdapter,它采用 <T>
的通用类型。 JsonAdpater 提供 JsonAdpater.toJson()
和 JsonAdapter.fromJson()
.
class MoshiParser() : JsonParser {
//initialize Moshi
private val moshi: Moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
override fun <T> fromJson(json: String, type: Type): T? {
//use jsonAdapter<T> for generic adapter
val jsonAdapter: JsonAdapter<T> = moshi.adapter(type)
return jsonAdapter.fromJson(json)
}
override fun <T> toJson(obj: T, type: Type): String? {
//use jsonAdapter<T> for generic adapter
val jsonAdapter: JsonAdapter<T> = moshi.adapter(type)
return jsonAdapter.toJson(obj)
}
}
这是我使用 Moshi 处理此问题的扩展
/*
* [Moshi] extension to transform an object to json
* */
inline fun <reified T> Moshi.objectToJson(data: T): String =
adapter(T::class.java).toJson(data)
/*
* [Moshi] extension to transform json to an object
* */
inline fun <reified T> Moshi.jsonToObject(json: String): T? =
adapter(T::class.java).fromJson(json)
您可以在此处找到更多要点 - Gist Link