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在线课程上所做项目的自定义适配器有关。是的,它是一个自定义适配器:)