使用 Retrofit 2.1 从 JSON 获取列表
Get List from JSON using Retrofit 2.1
我正在尝试使用 Retrofit 2.1 获取 JSON
并将其解析为 ArrayList<Manager>
。
我用 GET
请求创建了一个接口并初始化了 Retrofit。
为什么 response.isSuccessful()
是假的?
{
"managers":
[
{"name": "John Smith", "plan": "100"},
{"name": "Alex Sprite", "plan": "96"},
{"name": "Den Bollom", "plan": "2"},
{"name": "Jaromir Jagr", "plan": "68"},
{"name": "Wane Gretzky", "plan": "99"},
{"name": "Winsent Trade", "plan": "54"},
{"name": "Paul Dagger", "plan": "30"},
{"name": "Tommy Gun", "plan": "60"},
{"name": "Luc Perry", "plan": "15"},
{"name": "Tend Smarr", "plan": "64"}
]
}
接口管理器API:
public interface ManagerAPI {
String URL = "https://api.myjson.com/bins/get/";
@GET("xkyz.json")
Call <List<Manager>> getManagers();
}
POJO-Class:
public class Manager {
@SerializedName("managers")
private ArrayList<Manager> managers;
public ArrayList<Manager> getManagers() {
return managers;
}
public void setManagers(ArrayList<Manager> managers) {
this.managers = managers;
}
public Manager() {
}
String name;
int plan;
public Manager(String name, int plan) {
this.name = name;
this.plan = plan;
}
public String getName()
{
return name;
}
public int getPlan() {
return plan;
}
}
初始化改造:
private void requestData() {
Retrofit retrofit = getRetrofit();
ManagerAPI service = retrofit.create(ManagerAPI.class);
Call<List<Manager>> call = service.getManagers();
call.enqueue(new Callback<List<Manager>>() {
@Override
public void onResponse(Call<List<Manager>> call, Response<List<Manager>> response) {
Log.e("OnResponce", "OK");
if (response.isSuccessful()){
List<Manager> managers = response.body();
}
else Log.e("Response", "Not ok");
}
@Override
public void onFailure(Call<List<Manager>> call, Throwable t) {
Log.e("OnFailure", "Fail");
}
});
}
@NonNull
private Retrofit getRetrofit() {
return new Retrofit.Builder()
.baseUrl(ManagerAPI.URL)
.addConverterFactory(JacksonConverterFactory.create())
.build();
}
日志:
07-13 20:43:34.762 5402-5402/ru.alexbykov.jsonexample E/OnResponce: OK
07-13 20:43:34.762 5402-5402/ru.alexbykov.jsonexample E/Response Successful?: NO
07-13 20:43:34.762 5402-5402/ru.alexbykov.jsonexample E/response.message: Not Found
07-13 20:43:34.762 5402-5402/ru.alexbykov.jsonexample E/response.message: 404
07-13 20:43:34.762 5402-5402/ru.alexbykov.jsonexample E/response.message: null
07-13 20:43:34.978 5402-5469/ru.alexbykov.jsonexample E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9fd21c0
好的,那么第 1 步,我将修改 JSON 响应以避免额外的复杂性。这意味着删除根元素,使其如下所示。我们只剩下一个简单的数组。
[
{"name": "John Smith", "plan": "100"},
{"name": "Alex Sprite", "plan": "96"},
{"name": "Den Bollom", "plan": "2"},
{"name": "Jaromir Jagr", "plan": "68"},
{"name": "Wane Gretzky", "plan": "99"},
{"name": "Winsent Trade", "plan": "54"},
{"name": "Paul Dagger", "plan": "30"},
{"name": "Tommy Gun", "plan": "60"},
{"name": "Luc Perry", "plan": "15"},
{"name": "Tend Smarr", "plan": "64"}
]
第 2 步清理您的 POJO。
您调用 class Manager
,但您在其中包含有关包含经理列表的方法 model.Sounds 冗余 and/or 不是预期的。把这些东西丢在下面。
@SerializedName("managers")
private ArrayList<Manager> managers;
public ArrayList<Manager> getManagers() {
return managers;
}
public void setManagers(ArrayList<Manager> managers) {
this.managers = managers;
}
我正在尝试使用 Retrofit 2.1 获取 JSON
并将其解析为 ArrayList<Manager>
。
我用 GET
请求创建了一个接口并初始化了 Retrofit。
为什么 response.isSuccessful()
是假的?
{
"managers":
[
{"name": "John Smith", "plan": "100"},
{"name": "Alex Sprite", "plan": "96"},
{"name": "Den Bollom", "plan": "2"},
{"name": "Jaromir Jagr", "plan": "68"},
{"name": "Wane Gretzky", "plan": "99"},
{"name": "Winsent Trade", "plan": "54"},
{"name": "Paul Dagger", "plan": "30"},
{"name": "Tommy Gun", "plan": "60"},
{"name": "Luc Perry", "plan": "15"},
{"name": "Tend Smarr", "plan": "64"}
]
}
接口管理器API:
public interface ManagerAPI {
String URL = "https://api.myjson.com/bins/get/";
@GET("xkyz.json")
Call <List<Manager>> getManagers();
}
POJO-Class:
public class Manager {
@SerializedName("managers")
private ArrayList<Manager> managers;
public ArrayList<Manager> getManagers() {
return managers;
}
public void setManagers(ArrayList<Manager> managers) {
this.managers = managers;
}
public Manager() {
}
String name;
int plan;
public Manager(String name, int plan) {
this.name = name;
this.plan = plan;
}
public String getName()
{
return name;
}
public int getPlan() {
return plan;
}
}
初始化改造:
private void requestData() {
Retrofit retrofit = getRetrofit();
ManagerAPI service = retrofit.create(ManagerAPI.class);
Call<List<Manager>> call = service.getManagers();
call.enqueue(new Callback<List<Manager>>() {
@Override
public void onResponse(Call<List<Manager>> call, Response<List<Manager>> response) {
Log.e("OnResponce", "OK");
if (response.isSuccessful()){
List<Manager> managers = response.body();
}
else Log.e("Response", "Not ok");
}
@Override
public void onFailure(Call<List<Manager>> call, Throwable t) {
Log.e("OnFailure", "Fail");
}
});
}
@NonNull
private Retrofit getRetrofit() {
return new Retrofit.Builder()
.baseUrl(ManagerAPI.URL)
.addConverterFactory(JacksonConverterFactory.create())
.build();
}
日志:
07-13 20:43:34.762 5402-5402/ru.alexbykov.jsonexample E/OnResponce: OK
07-13 20:43:34.762 5402-5402/ru.alexbykov.jsonexample E/Response Successful?: NO
07-13 20:43:34.762 5402-5402/ru.alexbykov.jsonexample E/response.message: Not Found
07-13 20:43:34.762 5402-5402/ru.alexbykov.jsonexample E/response.message: 404
07-13 20:43:34.762 5402-5402/ru.alexbykov.jsonexample E/response.message: null
07-13 20:43:34.978 5402-5469/ru.alexbykov.jsonexample E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa9fd21c0
好的,那么第 1 步,我将修改 JSON 响应以避免额外的复杂性。这意味着删除根元素,使其如下所示。我们只剩下一个简单的数组。
[
{"name": "John Smith", "plan": "100"},
{"name": "Alex Sprite", "plan": "96"},
{"name": "Den Bollom", "plan": "2"},
{"name": "Jaromir Jagr", "plan": "68"},
{"name": "Wane Gretzky", "plan": "99"},
{"name": "Winsent Trade", "plan": "54"},
{"name": "Paul Dagger", "plan": "30"},
{"name": "Tommy Gun", "plan": "60"},
{"name": "Luc Perry", "plan": "15"},
{"name": "Tend Smarr", "plan": "64"}
]
第 2 步清理您的 POJO。
您调用 class Manager
,但您在其中包含有关包含经理列表的方法 model.Sounds 冗余 and/or 不是预期的。把这些东西丢在下面。
@SerializedName("managers")
private ArrayList<Manager> managers;
public ArrayList<Manager> getManagers() {
return managers;
}
public void setManagers(ArrayList<Manager> managers) {
this.managers = managers;
}