Retrofit Android:如何以一种好的方式将数组转换为POJO?

时间:2017-08-27 13:14:25

标签: android json gson retrofit retrofit2

我的问题是:如何插入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?
}

1 个答案:

答案 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使用的是什么)