codegen生成的adapter-constructor中的`moshi`是什么意思?
What does `moshi` in the adapter-constructor generated by codegen mean?
我是 kotlin 的新手-android 开发。
我想解析一个JSON喜欢
{
"name": "This is my name",
}
到 Foo
class 定义为
Foo.kt
@JsonClass(generateAdapter = true)
data class Foo(val name: String)
这个Foo
class文件通过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
class 的构造函数指定了 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)
我该怎么办?谢谢!
你应该使用 Moshi.Builder.add(Type, JsonAdapter)
instead of Moshi.Builder.add(JsonAdapter)
我是 kotlin 的新手-android 开发。
我想解析一个JSON喜欢
{
"name": "This is my name",
}
到 Foo
class 定义为
Foo.kt
@JsonClass(generateAdapter = true)
data class Foo(val name: String)
这个Foo
class文件通过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
class 的构造函数指定了 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)
我该怎么办?谢谢!
你应该使用 Moshi.Builder.add(Type, JsonAdapter)
instead of Moshi.Builder.add(JsonAdapter)