Дооснащение Ожидаемое BEGIN_OBJECT, но BEGIN_ARRAY

Я довольно новичок в анализе JSON, я использую библиотеку «Дооснащение» Square и столкнулся с этой проблемой.

Я пытаюсь разобрать этот ответ JSON:

[ { "id": 3, "username": "jezer", "regid": "oiqwueoiwqueoiwqueoiwq", "url": "http:\/\/192.168.63.175:3000\/users\/3.json" }, { "id": 4, "username": "emulator", "regid": "qwoiuewqoiueoiwqueoq", "url": "http:\/\/192.168.63.175:3000\/users\/4.json" }, { "id": 7, "username": "test", "regid": "ksadqowueqiaksj", "url": "http:\/\/192.168.63.175:3000\/users\/7.json" } ] 

Вот мои модели:

 public class Contacts { public List contacts; } 

 public class User { String username; String regid; @Override public String toString(){ return(username); } } 

мой интерфейс:

 public interface ContactsInterface { @GET("/users.json") void contacts(Callback cb); } 

мой метод успеха:

 @Override public void success(Contacts c, Response r) { List names = new ArrayList(); for (int i = 0; i < c.contacts.size(); i++) { String name = c.contacts.get(i).toString(); Log.d("Names", "" + name); names.add(name); } ArrayAdapter spinnerAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, names); mSentTo.setAdapter(spinnerAdapter); } 

Когда я использую его по моему методу успеха, он выдает ошибку

Ожидаемый BEGIN_OBJECT, но BEGIN_ARRAY в строке 1 column2

Что здесь не так?

6 Solutions collect form web for “Дооснащение Ожидаемое BEGIN_OBJECT, но BEGIN_ARRAY”

Прямо сейчас вы разбираете ответ так, как будто он был отформатирован следующим образом:

 { "contacts": [ { .. } ] } 

Исключение говорит вам об этом в том, что вы ожидаете объект в корне, но реальные данные на самом деле являются массивом. Это означает, что вам нужно изменить тип как массив.

Самый простой способ – просто использовать список в качестве прямого типа в обратном вызове:

 @GET("/users.json") void contacts(Callback> cb); 

в вашем интерфейсе замените

 @GET("/users.json") void contacts(Callback cb); 

По этому коду

 @GET("/users.json") void contacts(Callback> cb); 

Преобразуйте его в список.

Ниже приведен пример:

 BenchmarksListModel_v1[] benchmarksListModel = res.getBody().as(BenchmarksListModel_v1[].class); 

Исходный код

https://drive.google.com/open?id=0BzBKpZ4nzNzUVFRnVVkzc0JabUU

 public interface ApiInterface { @GET("inbox.json") Call> getInbox(); } call.enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { YourpojoClass.addAll(response.body()); mAdapter.notifyDataSetChanged(); } @Override public void onFailure(Call> call, Throwable t) { Toast.makeText(getApplicationContext(), "Unable to fetch json: " + t.getMessage(), Toast.LENGTH_LONG).show(); } }); 

dependencies used :

 compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' 

Ответы json могут быть array response или object response или даже комбинацией того и другого. См. Следующие три случая

Case 1 : Parsing a json array response (случай OP)

Этот случай применяется к тем json responses которые имеют вид [{...} ,{...}]

Например

 [ { "id": 3, "username": "jezer", "regid": "oiqwueoiwqueoiwqueoiwq", "url": "http:\/\/192.168.63.175:3000\/users\/3.json" }, . . ] 

Сначала создайте class модели для этого массива или просто перейдите в jsonschema2pojo и автоматически создайте такой, как показано ниже.

Contacts.java

 public class Contacts { @SerializedName("id") @Expose private Integer id; @SerializedName("username") @Expose private String username; @SerializedName("regid") @Expose private String regid; @SerializedName("url") @Expose private String url; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getRegid() { return regid; } public void setRegid(String regid) { this.regid = regid; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } 

ContactsInterface

В этом случае вы должны вернуть список объектов, таких как:

 public interface ContactsInterface { @GET("/users.json") Call> getContacts(); } 

Затем сделайте вызов retrofit2 следующим образом

 Retrofit retrofit = new Retrofit.Builder() .baseUrl("baseurl_here") .addConverterFactory(GsonConverterFactory.create()) .build(); SampleInterface request = retrofit.create(ContactsInterface.class); Call> call = request.getAll(); call.enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { Toast.makeText(MainActivity.this,response.body().toString(),Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call> call, Throwable t) { Log.e("Error",t.getMessage()); } }); 

response.body() предоставит вам список объектов

ВЫ МОЖЕТЕ ТАКЖЕ ПРОВЕРИТЬ СЛЕДУЮЩИЕ ДВА ДЕЛА ДЛЯ ССЫЛКИ

Case 2 : Parsing a json object response

Этот случай применим к тем json-ответам, которые имеют вид {..}

Например

 { "id": 3, "username": "jezer", "regid": "oiqwueoiwqueoiwqueoiwq", "url": "http:\/\/192.168.63.175:3000\/users\/3.json" } 

Здесь мы имеем тот же object что и выше. Таким образом, class модели будет таким же, но, как и в предыдущем примере, у нас нет массива этих объектов – всего один объект, и поэтому нам не нужно разбирать его как список.

Поэтому сделайте следующие изменения для object response

 public interface ContactsInterface { @GET("/users.json") Call getContacts(); } 

Затем сделайте вызов retrofit2 следующим образом

 Retrofit retrofit = new Retrofit.Builder() .baseUrl("baseurl_here") .addConverterFactory(GsonConverterFactory.create()) .build(); SampleInterface request = retrofit.create(ContactsInterface.class); Call call = request.getAll(); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { Toast.makeText(MainActivity.this,response.body().toString(),Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call call, Throwable t) { Log.e("Error",t.getMessage()); } }); 

response.body() предоставит вам объект

Case 3 : Parsing a json array inside json object

Этот случай применяется к тем json responses которые имеют вид {"array_name":[{...} ,{...}]}

Например

  { "contacts": [ { "id": 3, "username": "jezer", "regid": "oiqwueoiwqueoiwqueoiwq", "url": "http:\/\/192.168.63.175:3000\/users\/3.json" } ] } 

Здесь вам понадобятся два classа моделей, так как у нас есть два объекта (один внешний и один внутри массива). Создайте его, как показано ниже

ContactWrapper

 public class ContactWrapper { @SerializedName("contacts") @Expose private List contacts = null; public List getContacts() { return contacts; } public void setContacts(List contacts) { this.contacts = contacts; } } 

Вы можете использовать Contacts.java сгенерированную выше для объектов списка (сгенерированных для случая 1)

Поэтому сделайте следующие изменения для object response

 public interface ContactsInterface { @GET("/users.json") Call getContacts(); } 

Затем сделайте вызов retrofit2 следующим образом

 Retrofit retrofit = new Retrofit.Builder() .baseUrl("baseurl_here") .addConverterFactory(GsonConverterFactory.create()) .build(); SampleInterface request = retrofit.create(ContactsInterface.class); Call call = request.getAll(); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { Toast.makeText(MainActivity.this,response.body().getContacts().toString(),Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call call, Throwable t) { Log.e("Error",t.getMessage()); } }); 

Здесь разница от случая 1 заключается в том, что мы должны использовать response.body().getContacts() вместо response.body() чтобы получить список объектов

Используя MPV , в Deserializer, поставьте это

 JsonObject obj = new JsonObject(); obj.add("data", json); JsonArray data = obj.getAsJsonObject().getAsJsonArray("data"); 
  • API формата номера телефона Java
  • Как отключить SSLv3 в android для HttpsUrlConnection?
  • ЗАПРОС, ОПРЕДЕЛЕННЫЙ с помощью API-интерфейса Google Адресов для веб-сервера, используемого в приложении для Android
  • Есть ли способ автоматически генерировать геттеры и сеттеры в Eclipse?
  • Не удалось запустить sdkmanager --list (Android SDK) с Java 9
  • Java - чтение файла и разбиение на несколько файлов
  • Java: проблема неразрешенной компиляции
  • Сравнение строк - Android
  • Целочисленная арифметика в Java с символом char и integer literal
  • Изменение цвета плавающей кнопки Android
  • NoClassDefFoundError для проекта внешней библиотеки для Android
  • Interesting Posts

    Агрегирование результатов запроса SPARQL

    Как установить расширенные свойства файла?

    Измененный массив в области файлов

    Как отключить автоматическую настройку громкости микрофона?

    DMI 2.0 против 8.0 GT / s QPI?

    Android Share Intent для растрового изображения – возможно ли сохранить его ранее?

    Как далеко кабель HDMI может передавать сигнал 1080p + звук, пока он не станет потерянным?

    Переменные classа еще не поддерживаются.

    Список и выбор точек доступа WLAN (базовых станций) в Mac OS X

    ASP.NET Есть ли лучший способ найти элементы управления, которые находятся в пределах других элементов управления?

    MS excel – присвоение «категорий» на основе ключевых слов

    Гарантирован ли заказ для возврата ключей и значений из объекта LinkedHashMap?

    Что такое перманентное пространство?

    Загрузка нескольких файлов по одному с помощью AsyncTask?

    Третий конфликт прототипа / jQuery Chrome

    Давайте будем гением компьютера.