Я использую Retrofit в своем приложении для чтения данных из JSON в свое приложение. У меня есть этот JSON. (Я пробовал много решений, но у меня ничего не получалось). Пожалуйста, помогите мне с этим. я использовал тот же код кода с другим JSON, и он работает с этим Этот URL-адрес JSON, но не работает с моим JSON
JSONМой JSON размещен по этому URL
Мой интерфейс:
public interface SanaApi {
String BASE_URL = "http://www.hhfoodies.com/salesnotifier/";
@GET("sana_safinaz.php")
Call<List<SanaSafinas>> getSana();
}
Вот класс модели:
public class SanaSafinas {
private String id;
private String off;
private String image;
private String title;
private String sale_price;
private String original_price;
public SanaSafinas(String id, String off, String image, String title, String sale_price, String original_price) {
this.id = id;
this.off = off;
this.image = image;
this.title = title;
this.sale_price = sale_price;
this.original_price = original_price;
}
public String getId() {
return id;
}
public String getOff() {
return off;
}
public String getImage() {
return image;
}
public String getTitle() {
return title;
}
public String getSale_price() {
return sale_price;
}
public String getOriginal_price() {
return original_price;
}
}
Вот основная деятельность:
public class MainActivity extends AppCompatActivity {
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listViewHeroes);
//calling the method to display the heroes
getSana();
}
private void getSana() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(SanaApi.BASE_URL)
.addConverterFactory(GsonConverterFactory.create()) //Here we are using the GsonConverterFactory to directly convert json data to object
.build();
SanaApi api = retrofit.create(SanaApi.class);
Call<List<SanaSafinas>> call = api.getSana();
call.enqueue(new Callback<List<SanaSafinas>>() {
@Override
public void onResponse(Call<List<SanaSafinas>> call, Response<List<SanaSafinas>> response) {
List<SanaSafinas> heroList = response.body();
//Creating an String array for the ListView
String[] heroes = new String[heroList.size()];
//looping through all the heroes and inserting the names inside the string array
for (int i = 0; i < heroList.size(); i++) {
heroes[i] = heroList.get(i).getSale_price();
}
//displaying the string array into listview
listView.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, heroes));
}
@Override
public void onFailure(Call<List<SanaSafinas>> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
Скопируйте весь свой ответ в jsonschema2pojo.org, и он создаст ваш класс модели, автоматически целевой язык: java Тип источника: JSON Стиль аннотации: Gson и проверьте, включает ли геттер и сеттер
Ваш вызов модификации ожидает List<SanaSafinas>, который генерируется из массива JSON.
Ваш JSON - это не массив, это объект, и это то, что вам нужно сообщить модернизации, которую вы ожидаете.
class Response {
private final List<SanaSafinas> data;
public Response(List<SanaSafinas> data) {
this.data = data;
}
// Getter...
}
И тогда ваш интерфейс будет выглядеть так:
public interface SanaApi {
String BASE_URL = "http://www.hhfoodies.com/salesnotifier/";
@GET("sana_safinaz.php")
Call<Response> getSana();
Объекты JSON заключены в фигурные скобки, как у вас:
{
"message": "",
"status": 1,
"data": [
{
"id": "s18220052",
"off": "50% Off",
"image": "https://www.sanasafinaz.com/media/catalog/product/cache/2cf0e7f44e364cdf6f00ee795133d228/s/1/s18220052_1_.jpg",
"title": "SAFARI-O",
"sale_price": "PKR 2,720.00",
"original_price": "PKR 5440 "
},
...
}
Массивы JSON заключены в квадратные скобки, как и ваш первый URL:
[
{
"name": "Captain America",
"realname": "Steve Rogers",
"team": "Avengers",
"firstappearance": "1941",
....
},
...
}
Ваш класс модели не создан должным образом, как будто вы видите ответ, что все данные поступают внутрь data JsonArray, и вы непосредственно выполняете свою работу там, измените класс модели, чтобы он работал правильно
Создайте новый класс, который будет содержать ваш ответ, назовите его ResponseSana.
public class ResponseSana {
@SerializedName("message")
@Expose
private String message;
@SerializedName("status")
@Expose
private Integer status;
@SerializedName("data")
@Expose
private List< SanaSafinas > data = null;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public List< SanaSafinas > getData() {
return data;
}
public void setData(List< SanaSafinas > data) {
this.data = data;
}
}
и ваш интерфейс должен быть таким
Call<ResponseSana> getSana();
а затем измените свой onResponse в соответствии с измененным кодом, и все данные будут работать нормально, без ошибок.
Ваш класс модели не создан должным образом, как будто вы видите ответ, что все данные поступают внутри массива данных JsonArray, и вы непосредственно выполняете свою работу там, измените свой класс модели, чтобы он работал правильно