Android преобразует JSONArray в список с помощью GSON

#android #gson #retrofit

#Android #gson #модернизация

Вопрос:

Когда я хочу получить список из нашего веб-сервиса, который возвращает этот результат в виде JSONArray

 [{
  "b_code": 1,
  "c_code": 4,
  "f_code": 5462,
  "f_date": "/Date(1555270200000 0430)/",
  "f_meghdar": 11,
  "k_code": 1,
  "k_count": 150,
  "k_pay": 1500,
  "kalanam": "",
  "o_anbar": "",
  "o_code": 1,
  "o_date": "/Date(1555183800000 0430)/",
  "o_rasmi": true,
  "u_code": 0
}, 
...
]
  

теперь, когда я преобразую этот массив в класс, как List<Offers> например:

 Gson gson = new Gson();
Type type = new TypeToken<List<Offers>>() {}.getType();
List<Offers> contactList = gson.fromJson(response.body().toString(), type);
  

я получаю эту ошибку:

 java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $[0]
  

response.body() вывод:

 response.body() = {ArrayList@12995}  size = 4
 0 = {Offers@13020} 
 1 = {Offers@13021} 
 2 = {Offers@13022} 
 3 = {Offers@13023} 
  

Offers структура класса:

 public class Offers{
    @SerializedName("b_code")
    private Long mBCode;

    @SerializedName("c_code")
    private Long mCCode;

    @SerializedName("f_code")
    private Long mFCode;

    @SerializedName("f_date")
    private String mFDate;

    @SerializedName("f_meghdar")
    private Long mFMeghdar;

    @SerializedName("k_code")
    private Long mKCode;

    @SerializedName("k_count")
    private Long mKCount;

    @SerializedName("k_pay")
    private Long mKPay;

    @SerializedName("kalanam")
    private String mKalanam;

    @SerializedName("o_anbar")
    private String mOAnbar;

    @SerializedName("o_code")
    private Long mOCode;

    @SerializedName("o_date")
    private String mODate;

    @SerializedName("o_rasmi")
    private Boolean mORasmi;

    @SerializedName("u_code")
    private Long mUCode;

    /*GETTERS AND SETTERS*/
}
  

Комментарии:

1. не могли бы вы передать сюда свой класс модели данных, пожалуйста? Ошибка находится внутри объекта, для которого вы, возможно, объявили объект WhateverTheType , но на самом деле этот ответ (внутри массива) не имеет другого объекта.

2. @StavroXhardha да, конечно, мой пост обновлен

3. можете ли вы зарегистрировать этот response.body().toString() , хотите знать, является ли это допустимой строкой json или нет.

4. взгляните сюда futurestud.io/tutorials /…

5. это все, что у вас есть? Я считаю, что у вас должен быть класс, в котором вы храните массив предложений и, возможно, некоторые другие поля.

Ответ №1:

Используйте, как показано ниже

 Gson gson = new Gson();
Type type = new TypeToken<List<Offers>>() {}.getType();
List<Offers> contactList = gson.fromJson(response.body().string(), type);
  

Ответ №2:

Поскольку вы используете Retrofit , вам не нужно использовать gson для синтаксического анализа JSON . Когда вы вызываете response.body() , retrofit автоматически преобразует JSON строку в элемент pojo.

В настоящее время, когда вы делаете response.body().toString() , он сначала преобразует тело в List<Offer> , а затем вызывает toString() List<Offers> объект.Вот почему вы получаете

 0 = {Offers@13020} 
 1 = {Offers@13021} 
 2 = {Offers@13022} 
 3 = {Offers@13023} 
  

Проблема, должно быть, в вашем интерфейсе API. Возможно, вы неправильно определили возвращаемую переменную для метода.

Например.

Если ваш корневой элемент

 [{
  "b_code": 1,
  "c_code": 4,
  "f_code": 5462,
  "f_date": "/Date(1555270200000 0430)/",
  "f_meghdar": 11,
  "k_code": 1,
  "k_count": 150,
  "k_pay": 1500,
  "kalanam": "",
  "o_anbar": "",
  "o_code": 1,
  "o_date": "/Date(1555183800000 0430)/",
  "o_rasmi": true,
  "u_code": 0
}, 
...
]
  

Тогда ваш метод API interface должен быть примерно таким

 @GET("get_offers")
Call<**List<Offers>**> getOffers();
  

Комментарии:

1. я использую эту структуру интерфейса API