4

我正在使用 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;
}

是否可以patientId在对象中包含属性Patient

我能够将patient对象反序列化到Patient类中(具有相应的namelastName属性),但无法包含该patientId属性。

有任何想法吗?

4

4 回答 4

7

您可以为您的用例使用自定义反序列化器。这是它的样子:

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<Study>
{
    @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 输入应该按预期反序列化。

于 2013-10-05T06:17:46.157 回答
1

没有声明性的方式来进行这种对象转换:您正在转换 JSON 和 POJO 之间的结构。Jackson 在这方面的支持受到设计的限制:有两件事超出了范围:验证(使用外部验证;Bean Validation API 或 JSON Schema 验证器)和转换(可以使用JsonNode或外部库)。

于 2013-10-06T23:45:08.680 回答
0

根据这种格式的稳定性(以及您的 QA 人员的心情),您可以在将 Json 传递给 Jackson 之前直接更改它。这将修复损坏的东西。正则表达式是一个想法。在 Hashmap 中读取它,将值移动到那里并将其作为另一个固定的 Json 写出来。但在伪代码中更简单:

String json = "...";
String lines = json.split( "\r" );
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

(如果我不得不走这条路,我会使用 hashmap 方法)

于 2013-10-04T22:12:09.953 回答
-1

您将 patientId 存储在患者对象之外。把它放进去,一切都是闪亮的;)

如果你坚持把它放在 json 中,恐怕你有麻烦了。(最好是说服 Json 设计者将它存储在 Patient 对象中它所属的位置,就像你在 Java 中拥有它一样。)

如果没有任何帮助,您必须使用数据传输对象 ( https://en.wikipedia.org/wiki/Data_transfer_object ) 或自定义反序列化器 (设置 JSON 自定义反序列化器) 以便在理智和疯狂的表示之间进行转换。

于 2013-10-04T21:46:14.137 回答