#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