android - codegen生成的适配器构造函数中的 `moshi`是什么意思?

标签 android kotlin moshi

我是 kotlin-android 开发的新手。

我想解析像这样的 JSON

{
  "name": "This is my name",
}

定义为 Foo

Foo.kt

@JsonClass(generateAdapter = true)
data class Foo(val name: String)

这个Foo类文件通过codegen生成如下代码。

FooJsonAdapter.kt(由codegen生成)

class FooJsonAdapter(moshi: Moshi) : JsonAdapter<Foo>() {
    private val options: JsonReader.Options

    private val stringAdapter: JsonAdapter<String>

    override fun toString(): String

    override fun fromJson(reader: JsonReader): Foo 

    override fun toJson(writer: JsonWriter, value: Foo?) 
}

FooJsonAdapter 类的构造函数指定 Moshi 对象,这是我的问题。 应将哪种 Moshi 对象传递给构造函数?我尝试了以下方法,但这不起作用。

MainActivity.kt

Moshi.Builder().add(
    FooJsonAdapter(
        Moshi.Builder().build()
    )
).build()

错误信息

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.hoge, PID: 31816
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hoge/com.example.hoge.MainActivity}: java.lang.IllegalArgumentException: Expected at least one @ToJson or @FromJson method on com.example.hoge.FooJsonAdapter
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3260)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3396)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2009)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7319)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934)
     Caused by: java.lang.IllegalArgumentException: Expected at least one @ToJson or @FromJson method on com.example.hoge.FooJsonAdapter
        at com.squareup.moshi.AdapterMethodsFactory.get(AdapterMethodsFactory.java:137)
        at com.squareup.moshi.Moshi$Builder.add(Moshi.java:237)
        at com.example.hoge.MainActivity.onCreate(MainActivity.kt:14)
        at android.app.Activity.performCreate(Activity.java:7783)
        at android.app.Activity.performCreate(Activity.java:7772)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3235)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3396) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2009) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7319) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934) 

我该怎么办?谢谢!

最佳答案

关于android - codegen生成的适配器构造函数中的 `moshi`是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56984743/

相关文章:

android - 在 Android 设备上从网站下载 ssl 证书

java - 如何在 Gradle 中共享通用测试依赖版本?

android - 如何使用 MOSHI 将 un json 字符串解析为列表

json - Gson 或 Moshi : field in POJO could have 2 types, 如何保存到任何字段

java - Moshi + Retrofit - 处理 JSON 响应

android - 在 android 中显示来自非 Activity 类的对话框警报

android - 全屏 YouTube 播放器中隐藏在系统 UI 下的工具栏叠加层

java - 哪里可以学习JNI函数的用法?

java - 在 JUnit 5 中将测试摘要打印到控制台

java - utf8(阿拉伯语)字符串显示为问号(?)