簡體   English   中英

傑克遜JSON不擴展對象的屬性

[英]Jackson JSON not expanding attributes of object

我面對JSON序列化的怪異問題。 我有一些JPA對象,正在使用批注@JsonProperty將對象序列化和反序列化為JSON數據。

查詢。 java的

@Entity
@XmlRootElement
public class Query {

    @Id
    @GeneratedValue
    private int queryId;

    @ManyToOne
    @JoinColumn(name="institution_id")
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="institutionId")
    private InstitutionDetails institution;

    @ManyToOne
    @JoinColumn(name="department_id")
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="deptId")
    private Department department;

    @ManyToOne
    @JoinColumn(name="topic_id")
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="topicId")
    private Topic topic;

    @ManyToOne
    @JoinColumn(name="raised_by_user_id")
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property="email")
    private User raisedByUser;

    @Lob 
    private String query;

    @Column(name="query_date")
    private Date queryDate;

    @Column(name="query_answered")
    private boolean queryAnswered;

    @OneToMany(cascade=CascadeType.ALL, mappedBy="query", fetch=FetchType.LAZY)
    private Set<Response> responses;

    @JsonProperty
    public int getQueryId() {
        return queryId;
    }

    public void setQueryId(int queryId) {
        this.queryId = queryId;
    }

    @JsonProperty
    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    @JsonProperty
    public Topic getTopic() {
        return topic;
    }

    public void setTopic(Topic topic) {
        this.topic = topic;
    }

    @JsonProperty
    public User getRaisedByUser() {
        return raisedByUser;
    }

    public void setRaisedByUser(User raisedByUser) {
        this.raisedByUser = raisedByUser;
    }

    @JsonProperty
    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.query = query;
    }

    @JsonProperty
    public Date getQueryDate() {
        return queryDate;
    }

    public void setQueryDate(Date queryDate) {
        this.queryDate = queryDate;
    }

    @JsonProperty
    public boolean isQueryAnswered() {
        return queryAnswered;
    }

    public void setQueryAnswered(boolean queryAnswered) {
        this.queryAnswered = queryAnswered;
    }

    @JsonProperty
    public Set<Response> getResponses() {
        return responses;
    }

    public void setResponses(Set<Response> responses) {
        this.responses = responses;
    }

    @JsonProperty
    public InstitutionDetails getInstitution() {
        return institution;
    }

    public void setInstitution(InstitutionDetails institution) {
        this.institution = institution;
    }
}

Department.java

@Entity
@XmlRootElement
public class Department {

    @Id
    @GeneratedValue
    private int deptId;

    @Column(name="department_name", length=100)
    private String departmentName;

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @JoinColumn(name="department_id")
    private Set<Topic> topic;

    @OneToMany(cascade=CascadeType.ALL, mappedBy="department", fetch=FetchType.LAZY)
    private Set<Query> queries;

    @JsonProperty
    public int getDeptId() {
        return deptId;
    }

    public void setDeptId(int deptId) {
        this.deptId = deptId;
    }

    @JsonProperty
    public String getDepartmentName() {
        return departmentName;
    }

    public void setDepartmentName(String departmentName) {
        this.departmentName = departmentName;
    }

    @JsonProperty
    public Set<Topic> getTopic() {
        return topic;
    }

    public void setTopic(Set<Topic> topic) {
        this.topic = topic;
    }

    @JsonIgnore
    public Set<Query> getQueries() {
        return queries;
    }

    public void setQueries(Set<Query> queries) {
        this.queries = queries;
    }
}

QueryController.java

@GET
    @Path("/getAllAnsweredQueries/{institutionId}/{departmentId}/{topicId}")
    @Produces({MediaType.APPLICATION_JSON})
    public List<Query> getAllAnsweredQueries(@PathParam("institutionId") int institutionId, @PathParam("departmentId") int departmentId, @PathParam("topicId") int topicId) {
        return m_queryService.getAllAnsweredQueries(institutionId, departmentId, topicId);
    }

上面的方法返回一個List

但是,序列化JSON對象不包含列表中第二項的全部子對象詳細信息。 第一個JSON對象正確無誤。 然后列表中的第二個JSON對象缺少一些對象詳細信息:

輸出JSON

[
    {
        "queryId": 7,
        "institution": {
            "institutionId": 1004,
            "instituionName": "A College"
        },
        "department": {
            "deptId": 1,
            "departmentName": "Anatomy",
            "topic": [
                {
                    "topicId": 1003,
                    "topicName": "Nervous System"
                },
                {
                    "topicId": 1002,
                    "topicName": "Muscular System"
                },
                {
                    "topicId": 1006,
                    "topicName": "Vascular System"
                },
                {
                    "topicId": 1005,
                    "topicName": "Cells & Tissues"
                },
                {
                    "topicId": 1004,
                    "topicName": "Circulatory Sytem"
                },
                {
                    "topicId": 1001,
                    "topicName": "Skeletal System"
                }
            ]
        },
        "topic": {
            "topicId": 1001,
            "topicName": "Skeletal System"
        },
        "raisedByUser": {
            "email": "abcd@gmail.com",
            "userName": "User A",
            "userType": {
                "userTypeId": 10001,
                "userType": "Student"
            },
            "institutionDetails": 1004,
            "registeredDate": 1439136336000,
            "mobileNumber": "12346578"
        },
        "query": "What causes bone damage ?",
        "queryDate": 1439139172000,
        "queryAnswered": false,
        "responses": []
    },
    {
        "queryId": 6,
        "institution": 1004,
        "department": 1,
        "topic": {
            "topicId": 1002,
            "topicName": "Muscular System"
        },
        "raisedByUser": "abcd@gmail.com",
        "query": "What is the cause of spine disc lapse ?",
        "queryDate": 1439137989000,
        "queryAnswered": true,
        "responses": [
            {
                "responseId": 2,
                "query": {
                    "queryId": 6,
                    "institution": 1004,
                    "department": 1,
                    "topic": 1002,
                    "raisedByUser": "abcd@gmail.com",
                    "query": "What is the cause of spine disc lapse ?",
                    "queryDate": 1439137989000,
                    "queryAnswered": true,
                    "responses": [
                        {
                            "responseId": 2,
                            "query": 6,
                            "respondedByUser": {
                                "email": "mnop@gmail.com",
                                "userName": "User B",
                                "userType": {
                                    "userTypeId": 10002,
                                    "userType": "Expert"
                                },
                                "institutionDetails": 1004,
                                "registeredDate": 1439136400000,
                                "mobileNumber": "12346578"
                            },
                            "response": "Incorrect seating position",
                            "responseDate": 1439138916000
                        }
                    ]
                },
                "respondedByUser": "mnop@gmail.com",
                "response": "Incorrect seating position",
                "responseDate": 1439138916000
            }
        ]
    }
]

如果您在第一個結果(queryId:7)中注意到,部門對象和respondedByUser對象將被展開,而在第二個結果(queryId:6)中,部門和respondedByUser對象不會被擴展。 當我調試並查看序列化之前的值時,對象正確地具有各自的值。

為什么會這樣呢? 我想念什么嗎?

那是因為您@JsonIdentityInfo Jackson使用帶有注釋@JsonIdentityInfo對象ID。 因此,在最初完全序列化對象之后,其他參考將引用對象ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM