改造安卓:如何映射值数组?



端点返回如下所示的 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
}
});

请参阅此处的更多示例。

最新更新