Java GSON需要BEGIN_数组,但在第1行出现字符串错误

Java GSON需要BEGIN_数组,但在第1行出现字符串错误,java,android,gson,retrofit2,Java,Android,Gson,Retrofit2,我正在尝试使用从API返回的改装和GSON解析字符串数组: 这是响应通常的样子(情况1): 这是特定案例(案例2)中的响应: 在本例中(案例2),我从改装/GSON得到一个错误: W/System.err: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 2 path $ 01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/

我正在尝试使用从API返回的改装和GSON解析字符串数组:

这是响应通常的样子(情况1):

这是特定案例(案例2)中的响应:

在本例中(案例2),我从改装/GSON得到一个错误:

W/System.err: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 2 path $
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:117)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:106)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at java.lang.Thread.run(Thread.java:761)
我这样调用API:

Call<ArrayList<String>> scanResults = myAPI.getScanResults(id);
scanResults.enqueue(...)
调用scanResults=myAPI.getScanResults(id); scanResults.enqueue(…) 在正常情况下(情况1),数组可以很好地填充,但在这种情况下(情况2),它会抛出错误

我想这是因为空值。我尝试使用自定义类型适配器,但没有解决问题,在GsonBuilder上设置serializeNulls()也没有解决问题

有人知道解决办法吗

编辑:在进一步调试之后,服务器似乎出于某种原因返回了案例2中的字符串,而不是字符串数组。当我手动访问链接时,我确实看到了字符串数组,但由于某些原因,响应是字符串。

“预期的开始数组但为字符串”表示Gson正在解析的字符是
,但它预期的是
[
(因为您正在尝试解析列表)。由于输入与预期的输入不一致,Gson必须失败。从Gson的角度来看,案例2的输入与案例1的输入没有任何不同(如果出现空值问题,则错误消息会说明这一点)


因为此输入不可信(它来自第三方服务器?)您应该在解析调用周围添加一些错误处理代码,以说明输入格式不正确的可能性。至少,记录失败时收到的输入会立即表明您没有收到预期的数组。

您可以添加响应模型吗?问题在于think@JasonBourne我称之为API是这样的:
Call scanResults=myAPI.getScanResults(id);
在正常情况下,arrayList可以很好地填充,但在另一种情况下,如果为空值,它会抛出该错误。在抛出错误的地方添加另一个case result,这是它抛出错误的唯一情况。只有两种情况。@Pravinlook
W/System.err: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 2 path $
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:117)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:106)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
01-31 13:42:41.922 15746-15746/com.ssrij.testapp W/System.err:     at java.lang.Thread.run(Thread.java:761)
Call<ArrayList<String>> scanResults = myAPI.getScanResults(id);
scanResults.enqueue(...)