2017-01-31 5 views
3

Я пытаюсь разобрать массив строк с помощью Дооснащения и GSON, который возвращается из API:GSON Ожидаемого BEGIN_ARRAY но STRING в строке 1 ошибка

Это то, что реакция обычно выглядит (случай 1):

["Scan finished, scan information embedded in this object", "https://www.virustotal.com/url/297c349554bdc7e2f09a85be309f08cb2f16a9174068bd5bc6e298ed90a5eed9/analysis/1485313628/", 8, 64] 

Это то, что ответ выглядит как в конкретном случае (CASE 2):

["Scan request successfully queued, come back later for the report", "https://www.virustotal.com/url/d06ed0b4b29aab735ee7b85c5c0af98fd4d983edcc597afe60e4c4ac2e25ea08/analysis/1485847248/", null, null] 

в этом случае (CASE 2), я получаю сообщение об ошибке от Retrofit/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(...) 

и массив их получает штраф в обычном случае (случай 1), но в этом случае (случай 2), он выдает ошибку.

Я думаю, что это из-за нулевых значений. Я попытался использовать адаптер настраиваемого типа, но он не исправил проблему, также установив сериализациюNulls() в GsonBuilder, это не устранило проблему.

Кто-нибудь знает решение?

EDIT: После некоторой дополнительной отладки, кажется, что сервер возвращает строку в CASE 2 вместо массива String по какой-то причине. Когда я вручную нахожу ссылку, я вижу строковый массив, но по какой-то причине ответом является String.

+0

Можете ли вы добавить модель ответа? Проблема в том, что я думаю –

+0

@JasonBourne Я вызываю API следующим образом: 'Call > scanResults = myAPI.getScanResults (id);' и массивList получает заселение штрафа в обычном случае, но в другом случае с нулевым значения, он выдает эту ошибку – SomeAndroidProgrammar

+0

также добавляет другой результат, когда он выдает ошибку – Pavya

ответ

1

«Ожидаемое BEGIN_ARRAY но STRING» означает, что характер Gson является разбор является ", но он ожидал [ (так как вы пытаетесь разобрать список). Поскольку вход не соответствует ожидаемому входу, Gson должен потерпеть неудачу. С точки зрения Гссона, вход в регистр 2 не отличается от входного события case 1 (и если значения null были проблемой, сообщение об ошибке могло бы сказать что-то с этим эффектом).

Поскольку этот вход не является надежным (он исходит от стороннего сервера?), Вы должны добавить некоторый код обработки ошибок во время сеанса синтаксического анализа, чтобы учесть возможность того, что ввод неверен. При минимальном протоколировании полученный вход после сбоя немедленно дал бы понять, что вы не получаете ожидаемый массив.

Смежные вопросы