Что означает `moshi` в адаптере-конструкторе, сгенерированном codegen? - PullRequest
1 голос
/ 11 июля 2019

Я новичок в разработке 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) 

Что мне делать? Thx!

1 Ответ

2 голосов
/ 11 июля 2019

Вы должны использовать Moshi.Builder.add(Type, JsonAdapter) вместо Moshi.Builder.add(JsonAdapter)

...