Android преобразовывает JSONArray в список <class>с помощью GSON - PullRequest
0 голосов
/ 22 апреля 2019

Когда я хочу получить список от нашего веб-сервиса, который возвращает этот результат как 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*/
}

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Поскольку вы используете Retrofit, вам не нужно использовать gson для анализа JSON. Когда вы звоните response.body(), модификация автоматически преобразует строку 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();
0 голосов
/ 22 апреля 2019

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

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