【WebService】Jersey返回复杂Json数据          返回主页

今天IOS组开发的兄弟和我商量后台返回数据格式的问题,给出了类似如下的json数据

    {
    "age": "20岁",
    "id": 1,
    "name": "snowalker",
    "teacherBeans": [
        {
            "college": "学院0",
            "name": "教师0"
        },
        {
            "college": "学院1",
            "name": "教师1"
        },
        {
            "college": "学院2",
            "name": "教师2"
        }
    ]
}

这组数据看起来是一个json对象内嵌一个json数组。我们之前用jersey做过web 服务的开发,之前的文章也有涉及。

基本思路是在后台组装List,并向其中装入对象数据,在注解中明确返回类型为@Produces(MediaType.APPLICATION_JSON)返回前台之后,即可看到如下形式json数据

    [
        {
            "college": "学院0",
            "name": "教师0"
        },
        {
            "college": "学院1",
            "name": "教师1"
        },
        {
            "college": "学院2",
            "name": "教师2"
        }
    ]

问题在于这是一个json数组,其中的每一组数据之间是等价的,而上面提到的那组数据是需要在数组外围添加一个key,从而便于解析。

首先想到的就是使用Map,将list和对应的String装入之后返回的就是想要的数据。

然而想象不同于现实,jersey本身是不支持返回Map的。只能另寻他法。

和同组的saber聊过之后,分解了这组数据,明确了是一个对象嵌套一个对象数组。有了思路就好说了。于是我们有了如下代码。


Demo:Root.java

@XmlRootElement(name="teachers")
@Path("root")
public class Root {

    private List<TeacherBean> teacherBeans;

    private Integer id;
    private String name;
    private String age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public List<TeacherBean> getTeacherBeans() {
        return teacherBeans;
    }

    public void setTeacherBeans(List<TeacherBean> teacherBeans) {
        this.teacherBeans = teacherBeans;
    }

}

很明显的一个POJO,其中除了本体的属性之外添加了一个装入TeacherBean的List。

RootResource.java

@Path("root")
public class RootResource {

    @GET
    @Path("data")
    @Produces(MediaType.APPLICATION_JSON)
    public Root teachersInfo() {

        Root root = new Root();

        List<TeacherBean> teacherBeans = new ArrayList<>();
        for (int i = 0; i < 3; i++) {

            TeacherBean teacherBean = new TeacherBean();
            teacherBean.setName("教师" + String.valueOf(i));
            teacherBean.setCollege("学院" + String.valueOf(i));
            teacherBeans.add(teacherBean);
        }
        root.setAge("20岁");
        root.setId(1);
        root.setName("snowalker");
        root.setTeacherBeans(teacherBeans);
        return root;
    }
}

这段代码中主要做了两件事:

  1. 组装了一些教师对象并装入List
  2. 将List通过set设值注入Root中,然后将Root返回。

然后我们访问如下的URLhttp://localhost:8080/callingTheRoll-manageSys/webapi/root/data看到如下数据

{
    "age": "20岁",
    "id": 1,
    "name": "snowalker",
    "teacherBeans": [
        {
            "college": "学院0",
            "name": "教师0"
        },
        {
            "college": "学院1",
            "name": "教师1"
        },
        {
            "college": "学院2",
            "name": "教师2"
        }
    ]
}

小结

后台返回的数据均是各种数据之间通过组合之后而成,因此潜心分析一定可以得到想要的结果。