【问题标题】:What is Moshi's Equivalent of GSON's gson.fromJson() and gson.toJson()?GSON 的 gson.fromJson() 和 gson.toJson() 的 Moshi 等效项是什么?
【发布时间】:2022-01-05 06:46:18
【问题描述】:

我正在关注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 方法,但我什么也没得到。我该怎么办?

【问题讨论】:

标签: android json gson moshi


【解决方案1】:

我浏览了@CommonsWare提供的Moshi Documentations他上面的评论”

解决方案是首先将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"

然后创建一个类名MoshiParser,实现JsonParser接口并初始化Moshi。要让 Moshi 的注解与 Kotlin 一起正常工作,您只需在 Moshi Builder 上添加 KotlinJsonAdapterFactory

下一项是使用 Moshi 的 JsonAdapter,它采用 &lt;T&gt; 的泛型类型。 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)
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-27
    • 2018-11-12
    • 2012-10-16
    • 2010-10-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多