天天看點

jackson json 嵌套對象_關于json:Jackson:是否可以将父對象的屬性包含到嵌套對象中?...

我正在使用Jackson來序列化/反序列化JSON對象。

我為Study對象使用以下JSON:

{

"studyId": 324,

"patientId": 12,

"patient": {

"name":"John",

"lastName":"Doe"

}

}

更新:不幸的是,JSON結構無法修改。 這是問題的一部分。

我想将該對象反序列化為以下類:

public class Study {

Integer studyId;

Patient patient;

}

public class Patient {

Integer patientId;

String name;

String lastName;

}

是否可以在Patient對象中包含patientId屬性?

我能夠将Patient對象反序列化為Patient類(具有相應的name和lastName屬性),但是無法包含patientId屬性。

有任何想法嗎?

我真的不知道傑克遜是否會喜歡這樣,但是您可以嘗試将Patient作為内部類放在Study中,并将getPatientId()實作為return Study.this.patientId,以使資料看起來像是在哪裡 屬于第一位。 (不。如果不需要,我不會這樣做。)

您可以在用例中使用自定義解串器。這是它的樣子:

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParser;

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.DeserializationContext;

import com.fasterxml.jackson.databind.JsonDeserializer;

import com.fasterxml.jackson.databind.JsonNode;

public class StudyDeserializer extends JsonDeserializer

{

@Override

public Study deserialize(JsonParser parser, DeserializationContext context)

throws IOException, JsonProcessingException

{

JsonNode studyNode = parser.readValueAsTree();

Study study = new Study();

study.setStudyId(studyNode.get("studyId").asInt());

Patient patient = new Patient();

JsonNode patientNode = studyNode.get("patient");

patient.setPatientId(studyNode.get("patientId").asInt());

patient.setName(patientNode.get("name").asText());

patient.setLastName(patientNode.get("lastName").asText());

study.setPatient(patient);

return study;

}

}

在Study類中将上述類指定為反序列化器:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

@JsonDeserialize(using = StudyDeserializer.class)

public class Study

{

Integer studyId;

Patient patient;

// Getters and setters

}

現在,您指定的JSON輸入将按預期反序列化。

由于在代碼中使用了寫死的字段名稱,是以它将很快中斷。 添加(或删除)新字段-更改,字段名稱使用蛇形格式-更改。 :(應該有一些聲明方式。

沒有聲明性的方法可以進行這種對象轉換:您正在JSON和POJO之間轉換結構。

傑克遜在這一領域的支援受到設計的限制:兩件事超出了範圍:驗證(使用外部驗證; Bean驗證API或JSON Schema驗證器)和轉換(可以使用JsonNode或外部庫)。

根據此格式的穩定性(以及您的品質檢查人員的心情),您可以在将Json傳遞給Jackson之前直接對其進行更改。這将修複已損壞的内容。

正規表達式将是一個想法。在Hashmap中讀取它,将值移到那裡,然後将其寫為固定的Json。但是僞代碼更簡單:

String json ="...";

String lines = json.split("

" );

swap( lines[2], lines[3] ); //*1

String fixed = join( lines ); //*2

哪裡

*1: tmp = lines[2]; lines[2] = lines[3]; lines[3] = tmp;

*2: http://stackoverflow.com/questions/1515437/java-function-for-arrays-like-phps-join

(如果我必須走這條路線,我會使用哈希圖方法)

由于JSON結構來自外部來源,是以無法修改。 檢查問題的更新。

是的,你寫的。 這個答案是關于獲得後對其進行修改的。 是的,這很醜陋,但可以根據您項目的性質工作。

您已将PatientId存儲在患者對象之外。把它放進去,一切都是閃亮的;)

如果您堅持将其準确地放在json中,恐怕會遇到麻煩。 (最好是說服Json設計器将它存儲在屬于Patient對象的位置,就像在Java中一樣。)

如果沒有幫助,則必須使用資料傳輸對象(https://en.wikipedia.org/wiki/Data_transfer_object)或自定義反序列化器(設定JSON自定義反序列化器)才能在理智和瘋狂的表示方式之間進行轉換。

不幸的是,更改源JSON是不可行的。 patientId将存儲在patient對象的外部。