Android Moshi改装错误:“;应为字符串,但为BEGIN“u OBJECT”;

Android Moshi改装错误:“;应为字符串,但为BEGIN“u OBJECT”;,android,retrofit2,mockwebserver,moshi,Android,Retrofit2,Mockwebserver,Moshi,我构建了如下改装实例: Retrofit retrofit = new Retrofit.Builder() .baseUrl(server.url("/")) .addConverterFactory(MoshiConverterFactory.create(moshi)) .build(); server.enqueue(new MockResponse().setBody(jsonStr)); MyModel mo

我构建了如下改装实例:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(server.url("/"))
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .build();
server.enqueue(new MockResponse().setBody(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);
然后我调用我的MockWebServer实例,如下所示:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(server.url("/"))
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .build();
server.enqueue(new MockResponse().setBody(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);
其中jsonStr是这样构建的:

Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(server.url("/"))
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .build();
server.enqueue(new MockResponse().setBody(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);
例外情况是:

com.squareup.moshi.JsonDataException:应为字符串,但在路径处为BEGIN_对象$

我做错了什么?

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

@GET("/") Call<JsonObject> getString();
@GET(“/”)调用getString();
不是

@GET("/") Call<String> getString();
@GET(“/”)调用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()
这个问题与选举适应性有关

更改添加适配器的顺序后,即将.add(ElectionAdapter())放在顶部,如下所示,问题得到解决:

private val moshi = Moshi.Builder()
    .add(ElectionAdapter())
    .add(KotlinJsonAdapterFactory())
    .add(DateAdapter())
    .build()

在我的例子中,我省略了用于解析JSONString的
ScalarsConverterFactory

你看,我的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()

你救了我一天,谢谢:-)什么是SelectionAdapter?@IgorGanapolsky这与我们在Udacity在线课程上所做项目的自定义适配器有关。是的,它是一个自定义适配器:)