7

我像这样构建了我的改造实例:

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:应为字符串,但路径 $ 处为 BEGIN_OBJECT

我做错了什么?

4

3 回答 3

16

我找到了解决方案:我的 api 接口需要有

@GET("/") Call<JsonObject> getString();

不是

@GET("/") Call<String> getString();

原因是我在模拟 JSON 响应,而不是纯字符串。

于 2016-05-03T18:54:36.803 回答
4

就我而言,当我的代码如下时,我得到了问题中提到的相同错误。

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()
于 2021-03-22T13:37:41.337 回答
2

对于我的情况,我省略了ScalarsConverterFactory解析 JSONString

你看我的 API 调用应该返回一个 JSON 字符串

` @GET("neo/rest/v1/feed")
     suspend fun getNearEarthObjects(@Query("api_key") apiKey: String): String`

在构建改造对象时,我有用于解析 Kotlin 对象的 Moshi,但我忘记了 ScalarsConverter

//Build Retrofit Object
val retrofit =
    Retrofit.Builder()
        .addConverterFactory(ScalarsConverterFactory.create())
        .addConverterFactory(MoshiConverterFactory.create(moshi))
        .baseUrl(BASE_URL)
        .build()
于 2021-05-26T17:16:27.360 回答