java - جسون التسلسل من بوجوس مع الكائنات الطفل



json serialization (2)

لنفترض أن لدي خدمة ويب مريحة مع الواجهات التالية:

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"
        }
    ]
}

لذلك، عند طلب قائمة من الآباء والأمهات، فإن تمثيل جسون لكل والديه تكون قائمة مع الجرار الطفل. عند طلب مورد أصل محدد سوف يحتوي تمثيل جسون على قائمة بتمثيلات جسون الطفل.

مع جيرسي الطريقة المشتركة سيكون لتحديد اثنين من بوجوس جافا بسيطة ومورد بسيط:

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;
    }
}

كيف يمكنني حقن الجنين / الكائنات في السيناريوهات المذكورة أعلاه؟ هل هناك أي أفضل الممارسات؟ كيف يمكنك حل هذا؟

شكر.


Answer #1

في هذه الحالة أود أن تجعل الطبقة الأم الموسعة مثل هذا:

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;
    }
}

انها ليست وسيلة لطيفة جدا. أنا منفتح على بدائل أخرى ...


Answer #2

لا تقم بتخزين المعرفات الفرعية في الكائن الأصل، تقوم بتخزين قائمة من الأطفال ككائنات ...

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




jersey