JSON序列化pojos与子对象

时间:2012-05-14 15:11:20

标签: java json serialization jersey

假设我有一个带有以下界面的宁静网络服务:

GET /some/parent

这将返回类似

的内容
[
    {
        urn: "/some/parent/1",
        name: "parent1",
        children: [ "/some/child1", "/some/child2" ]
    },
    {
        urn: "/some/parent/2",
        name: "parent2",
        children: [ "/some/child3", "/some/child4" ]
    }
]

而且,我有

GET /some/parent/{id}

返回这样的内容:

{
    urn: /some/parent/1,
    name: parent1,
    children: [
        {
            urn: "/some/child1",
            name: "child1"
        },
        {
            urn: "/some/child2",
            name: "child2"
        }
    ]
}

因此,在请求父母列表时,每个父母的json表示将与子瓮一起列出。请求特定父资源时,json表示将包含子json表示的列表。

使用平针织物的常用方法是定义两个简单的java pojos和一个简单的资源:

public class Parent {
    private String id;
    private String name;
    private List<String> childIds;
    ...
    @JsonIgnore
    public String getId()...
    @JsonProperty
    public String getUrn()...
}

public class Child {
    private String id:
    private String name;
    ...
    @JsonIgnore
    public String getId()...
    @JsonProperty
    public String getUrn()...
}

@Path("/some/parent")
@Produces(MediaType.APPLICATION_JSON)
public class ParentResource() {
    @GET
    public List<Parent> findAll() {
        List<Parent> result = // some database query call
        return result;
    }

    @GET
    @Path("{id}")
    public Parent find(@PathParam("id") String id) {
        Parent parent = // some database call
        return parent;
    }
}

如何在上述场景中注入儿童骨灰盒/物体?有没有最佳做法?你是如何解决这个问题的?

感谢。

2 个答案:

答案 0 :(得分:1)

在这种情况下,我宁愿像这样建立一个扩展的Parent类:

public class ParentExtended extends Parent {
    private List<Child> childrenObjects;

    public ParentExtended(Parent parent) {
        this.id = parent.getId();
        ...
    }

    @JsonProperty("children")
    public List<Child> getChildrenObjects() { ... }

    @Override
    @JsonIgnore
    public List<String> getChildren() { ... }
}


@Path("/some/parent")
@Produces(MediaType.APPLICATION_JSON)
public class ParentResource() {
    @GET
    public List<Parent> findAll() {
        List<Parent> result = // some database query call
        return result;
    }

    @GET
    @Path("{id}")
    public ParentExtended find(@PathParam("id") String id) {
        Parent parent = // some database call
        ParentExtended parentEx = new ParentExtended(parent);

        for (String childId : parent.getChildren()) {
            parentEx.getChildrenObjects().add(// fetch the child object);
        }
        return parentEx;
    }
}

这不是一个很好的方式。我对其他替代方案持开放态度......

答案 1 :(得分:0)

您不会将子ID存储在父对象中,而是将子列表存储为对象...

public class Parent {
    private String id;
    private String name;
    private List<Child> children;
    ...
    @JsonIgnore
    public String getId()...
    @JsonProperty
    public String getUrn()...
}