我的问题是:如何插入GSON转换(或其他内容),以便API的输出直接List<Student>
。
目前我在API调用之外这样做,我认为这是一个糟糕的代码:
for (List<String> eachData : data) {
result.add(new Student(eachData.get(1), Integer.valueOf(eachData.get(2))));
}
Json Response(注意:每个学生都是一个数组,而不是对象)
{
"data":[
[
1,
"Tom",
18,
"USA"
],
[
2,
"Linda",
21,
"Mexico"
]
],
"other":[
"100",
"400"
]
}
StudentsApi.java
@GET("/api/test.json")
Observable<GetStudentsResponse> getStudents();
GetStudentsResponse.java
public class GetStudentsResponse {
public List<List<String>> data; // PROBABLY NEED TO CHANGE HERE?
}
如果我执行了此操作,则会收到错误 expected begin_object but was begin_array retrofit
。
public class GetStudentsResponse {
public List<Student> data;
}
Student.java
class Student {
int age;
String name;
// what do I do here? How can I map the array to object?
}
答案 0 :(得分:2)
你的JSON意味着它以Object开头,然后有一个名为 data 的JSONArray,其中包含另一个带有泛型类型(String,Integers)的 JSONArray 。 它还包括另一个 JSONArray ,名为其他,包括样本中的字符串。这意味着:
@GET("/api/test.json")
Observable<GetStudentsResponse> getStudents();
如果你使用,会有效
public List<List<Object>> data;
public List<String> other;
刚刚使用单元测试并且工作正常。
@Test
public void testGsonSerialize() {
String jsonArr = "{\"data\":[[1,\"Tom\",18,\"USA\"],[2,\"Linda\",21,\"Mexico\"]],\"other\":[\"100\",\"400\"]}";
GetStudentsResponse getStudentsResponse = new Gson().fromJson(jsonArr, GetStudentsResponse.class);
Assert.assertTrue(getStudentsResponse.data.size() > 0);
Assert.assertTrue(getStudentsResponse.other.size() > 0);
}
确保如果你的“其他”不包含你将其键入为对象的字符串而不是其它它会抛出一个Cast或Parse异常(不确定Gson使用的是什么)