Moshi 适配器创建失败:“需要显式注册 JsonAdapter”

kil*_*bit 5 android kotlin moshi

 var wall= ArrayList<VKWall>()
    try {
         val response = r.getString("response") as String
        val moshi = Moshi.Builder().build()
        val type: Type = Types.newParameterizedType(
            ArrayList::class.java,
            VKWall::class.java
        )
        val jsonAdapter: JsonAdapter<ArrayList<VKWall>> = moshi.adapter(type)

        wall = jsonAdapter.fromJson(response)!!

    } catch (e: JSONException){}

    return wall
Run Code Online (Sandbox Code Playgroud)

它无法创建适配器。调试器无法执行此字符串并通过此代码进入函数异常

val jsonAdapter: JsonAdapter<ArrayList<VKWall>> = moshi.adapter(type)
Run Code Online (Sandbox Code Playgroud)

我正在尝试做类似的事情 https://github.com/square/moshi

Platform java.util.ArrayList<com.e.app.fragments.vk_tabs.WallFragment.DataPackage.VKWall> (with no annotations) requires explicit JsonAdapter to be registered


@Parcelize
@JsonClass(



   generateAdapter = true)
    data class VKWall (
      //  val UserName:String="",
       // val UserSurname:String="",
        @Json(name = "text")
        val Text:String="" ,
      //  val attachments: Attachments?,
      //  val copyright: String="",
      //  val repost: Repost? 
    ):Parcelable
    {


    }
Run Code Online (Sandbox Code Playgroud)

小智 3

问题在于 moshi 没有适用于您的 VKWall 类的适配器。要解决此问题,您可以KotlinJsonAdapterFactory根据反射添加:

\n\n
val moshi = Moshi.Builder()\n    // ... add your own JsonAdapters and factories ...\n    .add(KotlinJsonAdapterFactory())\n    .build()\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者您可以使用生成的适配器,如下所示:

\n\n
// Annotate yours class @JsonClass(generateAdapter = true)\n@JsonClass(generateAdapter = true)\nclass VKWall(\n ....\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关此的更多文档https://github.com/square/moshi#kotlin

\n\n

有关您问题的更多信息https://www.zacsweers.dev/a-closer-look-at-moshi-1-9/

\n\n
\n

现在,对于 Kotlin 类,您要么需要使用代码生成、\n KotlinJsonAdapterFactory,要么提供您自己的自定义 JsonAdapter。\n 这是一个潜在危险的更改!在使用 code gen 的项目中,如果您忘记使用 @JsonClass 注释 Kotlin 类,那么在某些情况下,Kotlin 类可能(似乎)只是在 Work\xe2\x84\xa2\xef\xb8\x8f 之前工作。这些现在将在运行时失败。如果您担心这一点,我建议仅在调试版本中使用 Moshi 1.9 一段时间,以便在发布生产版本之前梳理这些问题。

\n
\n