天天看点

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对象的外部。