提问者:小点点

使用moshi/reverfit将JSONObject作为字符串获取


我有一个从API下来的对象,它带有另一个json对象(没有命名属性)作为其属性之一:

"stickerData": {}

我希望将此解析为此对象:

@JsonClass(generateAdapter = true)
class StickerDto(
        @Json (name = "totalAnimatedStickers") val total: Int,
        @Json(name = "pages") val pages: Int,
        @Json(name = "data") val stickers: List<Sticker>

)



@JsonClass(generateAdapter = true)
class Sticker(
        @Json(name = "name") val name: String,
        @Json(name = "id") val id: String,
        @Json(name = "stickerData") val stickerData: String,

)

这个应用程序的架构为每个API调用使用一个改型实例:

private fun createNewUserApiClient(authRefreshClient: AuthRefreshClient,
                                       preferencesInteractor: PreferencesInteractor): UserApiClient {
        val moshi = Moshi.Builder()
                .add(SkipBadElementsListAdapter.Factory)
             

        return Retrofit.Builder()
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(MoshiConverterFactory.create(moshi))
                .baseUrl(Interactors.apiEndpoint)
                .build()
                .create(UserApiClient::class.java)
    }

它使用了您可以在上面看到连接的适配器:

internal class SkipBadElementsListAdapter(private val elementAdapter: JsonAdapter<Any?>) : JsonAdapter<List<Any?>>() {

    object Factory : JsonAdapter.Factory {
     
    override fun fromJson(reader: JsonReader): List<Any?>? {
        val result = mutableListOf<Any?>()
        reader.beginArray()
        while (reader.hasNext()) {
            try {
                val peeked = reader.peekJson()
                result.add(elementAdapter.fromJson(peeked))
            } catch (e: JsonDataException) {
                Timber.w(e, "Item skipped while parsing:")
            }
            reader.skipValue()
        }
        reader.endArray()
        return result
    }

}

但是,该适配器不允许将JSON对象解析为字符串。 如果我尝试,它会抛出一个

Gson: Expected a string but was BEGIN_OBJECT

错误。 有什么方法可以让这个适配器将像这样的属性解析为原始字符串,而不是寻找一个对象?


共1个答案

匿名用户

stickerData应该是POJO类中的Object,如下所示。。。

@JsonClass(generateAdapter = true)
class Sticker(
        @Json(name = "name") val name: String,
        @Json(name = "id") val id: String,
        @Json(name = "stickerData") val stickerData: StickerData,

)