什么是GSON的gson.fromJson()和gson.toJson()的莫希等价?

fquxozlt  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(206)

我在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没有toJson()fromJson()方法。

我试过寻找相当于GSON的toJson()fromJson()的莫希方法,但是我什么都没有得到。我该怎么做呢?

brgchamk

brgchamk1#

我仔细阅读了@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接口的类名MoshiParser,并初始化Moshi。为了使莫希的注解能够在Kotlin中正常工作,只需在Moshi Builder上添加KotlinJsonAdapterFactory
下一个项目是使用莫希的JsonAdapter,它接受<T>的泛型类型。

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)
    }

}
velaa5lx

velaa5lx2#

这是我和莫希的分机号

/*

* [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 -Gist Link上找到更多信息

相关问题