Moshi Retrofit error: "Expected a string but was BEGIN_OBJECT"
Moshi Retrofit error: "Expected a string but was BEGIN_OBJECT"
我这样构建了 Retrofit 实例:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(server.url("/"))
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build();
然后我这样调用我的 MockWebServer 实例:
server.enqueue(new MockResponse().setBody(jsonStr));
其中jsonStr是这样构建的:
MyModel model = new MyModel("HOME", "AWAY", "ENTERTAIN", "NIGHT", "MUTE",
"VOLUME", "SCENE 1", "SCENE 2", "SCENE 3");
JsonAdapter<MyModel> jsonAdapter = moshi.adapter(MyModel.class).toJson(model);
然而,此时代码崩溃:
Response response = api.getString().execute();
例外情况是:
com.squareup.moshi.JsonDataException: Expected a string but was BEGIN_OBJECT at path $
我做错了什么?
我找到了解决方案:
我的 api 界面需要
@GET("/") Call<JsonObject> getString();
不是
@GET("/") Call<String> getString();
原因是我在模拟 JSON 响应,而不是普通字符串。
在我的例子中,当我的代码如下时,我得到了问题中提到的相同错误。
com.squareup.moshi.JsonDataException: Expected BEGIN_OBJECT but was STRING at path $.elections[0].ocdDivisionId
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.add(DateAdapter())
.add(ElectionAdapter())
.build()
问题与 ElectionAdapter 有关。
改变添加适配器的顺序,将.add(ElectionAdapter())放在最前面,如下图,问题解决:
private val moshi = Moshi.Builder()
.add(ElectionAdapter())
.add(KotlinJsonAdapterFactory())
.add(DateAdapter())
.build()
对于我的情况,我省略了 ScalarsConverterFactory
来解析 JSONString
你看我的 API 调用应该 return 一个 JSON 字符串
` @GET("neo/rest/v1/feed")
suspend fun getNearEarthObjects(@Query("api_key") apiKey: String): String`
在构建 Retrofit 对象时,我有用于解析 Kotlin 对象的 Moshi,但我忘记了 ScalarsConverter
//Build Retrofit Object
val retrofit =
Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(BASE_URL)
.build()
我这样构建了 Retrofit 实例:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(server.url("/"))
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build();
然后我这样调用我的 MockWebServer 实例:
server.enqueue(new MockResponse().setBody(jsonStr));
其中jsonStr是这样构建的:
MyModel model = new MyModel("HOME", "AWAY", "ENTERTAIN", "NIGHT", "MUTE",
"VOLUME", "SCENE 1", "SCENE 2", "SCENE 3");
JsonAdapter<MyModel> jsonAdapter = moshi.adapter(MyModel.class).toJson(model);
然而,此时代码崩溃:
Response response = api.getString().execute();
例外情况是:
com.squareup.moshi.JsonDataException: Expected a string but was BEGIN_OBJECT at path $
我做错了什么?
我找到了解决方案: 我的 api 界面需要
@GET("/") Call<JsonObject> getString();
不是
@GET("/") Call<String> getString();
原因是我在模拟 JSON 响应,而不是普通字符串。
在我的例子中,当我的代码如下时,我得到了问题中提到的相同错误。
com.squareup.moshi.JsonDataException: Expected BEGIN_OBJECT but was STRING at path $.elections[0].ocdDivisionId
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.add(DateAdapter())
.add(ElectionAdapter())
.build()
问题与 ElectionAdapter 有关。
改变添加适配器的顺序,将.add(ElectionAdapter())放在最前面,如下图,问题解决:
private val moshi = Moshi.Builder()
.add(ElectionAdapter())
.add(KotlinJsonAdapterFactory())
.add(DateAdapter())
.build()
对于我的情况,我省略了 ScalarsConverterFactory
来解析 JSONString
你看我的 API 调用应该 return 一个 JSON 字符串
` @GET("neo/rest/v1/feed")
suspend fun getNearEarthObjects(@Query("api_key") apiKey: String): String`
在构建 Retrofit 对象时,我有用于解析 Kotlin 对象的 Moshi,但我忘记了 ScalarsConverter
//Build Retrofit Object
val retrofit =
Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(BASE_URL)
.build()