端点返回如下所示的 JSON 响应。
{
"students":[
[
1,
"Tom",
18,
"USA"
],
[
2,
"Linda",
21,
"Mexico"
]
],
"other":[
"100",
"400"
]
}
假设我只关心回复中的students
,并希望获得学生名单。在响应中,每个学生都表示为一个没有键的值数组:
[id, name, age, country]
(假设可以有更多字段,但每个学生的字段顺序相同(
class GetStudentsResponse {
Student[] students;
}
class Student {
String name;
int age;
// HOW CAN I TELL RETROFIT TO MAP CORRECTLY HERE?
}
Retrofit 本身并不执行 JSON(反(序列化 - 它使用另一个库,默认情况下是 GSON。
在你拥有的输入中,你实际上有一个数组([id, name, age, country]
(,所以你不能使用GSON默认生成的序列化程序将其解析为对象(你需要有JSON对象(。
在这种情况下,您可以将该数组解析为String[]
并将其解析为Student
,或者为该输入编写自己的 GSON 序列化程序。我会推荐第二种解决方案:
JsonSerializer<Student> serializer = new JsonSerializer<Merchant>() {
@Override
public JsonElement serialize(Student src, Type typeOfSrc, JsonSerializationContext context) {
// Implement serializer here
}
};
JsonDeserializer<Student> serializer = new JsonDeserializer<Student>() {
@Override
public JsonElement deserialize(Student src, Type typeOfSrc, JsonSerializationContext context) {
// Implement deserializer here
}
};
你会像这样使用它:Gson gson = new GsonBuilder().registerTypeAdapter(Student.class, serializer).create();
另一种方法是创建一个TypeAdapter
.下面是 Gson 文档中的示例:
public class PointAdapter extends TypeAdapter<Point> {
public Point read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
String xy = reader.nextString();
String[] parts = xy.split(",");
int x = Integer.parseInt(parts[0]);
int y = Integer.parseInt(parts[1]);
return new Point(x, y);
}
public void write(JsonWriter writer, Point value) throws IOException {
if (value == null) {
writer.nullValue();
return;
}
String xy = value.getX() + "," + value.getY();
writer.value(xy);
}
}
改造 2.当端点响应正文以数组开头时,例如:
[
{"name": "John",
"email": "john@example.com"
},
{"name": "Jess",
"email": "jess@example.com"
},
...
]
您可以使用以下方法:
用户.java
public class User {
public String name;
public String email;
}
接口:例如接口API.java
public interface InterfaceAPI {
@GET("users")
Call<List<User>> getUsers();
}
数据提供程序类:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com")
.client(okHttpClient)
.build();
InterfaceAPI retrofitAPI = retrofit.create(InterfaceAPI);
Call<List<User>> call = interfaceAPI.getUsers();
call.enqueue(new Callback<RegistrationResponse>() {
@Override
public void onResponse(@NonNull Call<List<User>>call, @NonNull Response<List<User>> response) {
if (response.isSuccessful()) {
// your code
} else {
// your code
}
}
@Override
public void onFailure(@NonNull Call<List<User>> call, @NonNull Throwable t) {
//TODO
}
});
请参阅此处的更多示例。