Java 使用Jackson为两个不同的JSON提供一个POJO

Java 使用Jackson为两个不同的JSON提供一个POJO,java,json,jackson,deserialization,Java,Json,Jackson,Deserialization,JSON 1: JSON 2: [ { "a": 23118, "b": "3373141", "c": "abcd", "d": "d_name", "override": false, "qty1": 2000.0, "qty2": 2000.0, "qty3": 2000.0, "qty4": 2000.0, "update

JSON 1:

JSON 2:

[
    {
        "a": 23118,
        "b": "3373141",
        "c": "abcd",
        "d": "d_name",
        "override": false,
        "qty1": 2000.0,
        "qty2": 2000.0,
        "qty3": 2000.0,
        "qty4": 2000.0,
        "update": "01:00:00"
    },
    {},
    {},
    ...
]
代码:


是否可以使用一个POJO类转换JSON 1和JSON 2?或者我必须创建两个不同的POJO?

您还没有显示您的
responsePOJO
类的外观,但是您可以。您可以做的是像往常一样创建所有已知字段,然后将未知项存储为地图,并使用Jacksons
JsonAnySetter
annotation

例如,将其他字段存储在地图中,如下所示:

ObjectMapper objectMapper = new ObjectMapper();
responsePOJO responsePOJOObj = objectMapper.readValue(JSONString, responsePOJO.class);
abstract class PojoParent {
    int qty1;
    int qty2;
    boolean override;
    ...
}

class Pojo1 extends PojoParent {
    String a;
    ...
}

class Pojo2 extends PojoParent {
    String e;
    ...
}
private-Map-otherFields=new-HashMap();
@JSONANYSETER
公共无效集(字符串名称、对象值){
otherFields.put(名称、值)
}

然后,Jackson将为在标准字段列表中找不到的任何字段调用此
set
方法

您尚未显示您的
responsePOJO
类的外观,但您可以。您可以做的是像往常一样创建所有已知字段,然后将未知项存储为地图,并使用Jacksons
JsonAnySetter
annotation

例如,将其他字段存储在地图中,如下所示:

ObjectMapper objectMapper = new ObjectMapper();
responsePOJO responsePOJOObj = objectMapper.readValue(JSONString, responsePOJO.class);
abstract class PojoParent {
    int qty1;
    int qty2;
    boolean override;
    ...
}

class Pojo1 extends PojoParent {
    String a;
    ...
}

class Pojo2 extends PojoParent {
    String e;
    ...
}
private-Map-otherFields=new-HashMap();
@JSONANYSETER
公共无效集(字符串名称、对象值){
otherFields.put(名称、值)
}

Jackson将为在标准字段列表中找不到的任何字段调用此
set
方法

如果只是一些字段不同,我建议使用2 POJO和包含公共字段的公共父类

private Map<String, Object> otherFields = new HashMap<>();

@JsonAnySetter
public void set(String name, Object value) {
    otherFields.put(name, value)
}

只使用一个类可能有一些技巧,但我建议使用最简单和全面的解决方案。

如果只是一些字段不同,我建议使用2 POJO和包含公共字段的公共父类

private Map<String, Object> otherFields = new HashMap<>();

@JsonAnySetter
public void set(String name, Object value) {
    otherFields.put(name, value)
}

仅使用一个类可能有一些技巧,但我建议使用最简单和全面的解决方案。

您可以使用
JsonIgnoreProperties
注释如下:

ObjectMapper objectMapper = new ObjectMapper();
responsePOJO responsePOJOObj = objectMapper.readValue(JSONString, responsePOJO.class);
abstract class PojoParent {
    int qty1;
    int qty2;
    boolean override;
    ...
}

class Pojo1 extends PojoParent {
    String a;
    ...
}

class Pojo2 extends PojoParent {
    String e;
    ...
}

因此,通过这种方式,您可以保留一个类,但可以转换两个不同的JSON字符串。

您可以像这样使用
JsonIgnoreProperties
注释:

ObjectMapper objectMapper = new ObjectMapper();
responsePOJO responsePOJOObj = objectMapper.readValue(JSONString, responsePOJO.class);
abstract class PojoParent {
    int qty1;
    int qty2;
    boolean override;
    ...
}

class Pojo1 extends PojoParent {
    String a;
    ...
}

class Pojo2 extends PojoParent {
    String e;
    ...
}

这样,您可以保留一个类,但可以转换两个不同的JSON字符串。

有什么细微的区别?您可以格式化JSON吗?是的,您需要两个POJO或一个可以从两个属性名解析的自定义反序列化程序。@SotiriosDelimanolis原始JSON 1和JSON 2中的15个字段相同,而这两个字段中只有4个字段不同。使用自定义反序列化程序,您可以检查JSON中是否存在e/f/g/h或a/b/c/d,并独立分配各自的值。有什么细微的区别?请格式化您的JSON?是,您需要两个POJO或一个可以从两个属性名解析的自定义反序列化程序。@SotiriosDelimanolis原始JSON 1和JSON 2中的15个字段相同,而这两个字段中只有4个字段不同。使用自定义反序列化程序,您可以检查JSON中是否存在e/f/g/h或a/b/c/d,并独立分配相应的值。虽然这在序列化过程中有效,但在反序列化过程中不起作用,因为当字符串内容是动态的时,您无法知道要使用哪个子类。这一点很好。要使用它,您必须使用
@JsonTypeInfo
et
@JsonSubTypes
注释,但随后必须引入一个额外的鉴别器字段来区分它们。虽然这在序列化过程中有效,这在反序列化期间不起作用,因为当字符串内容是动态的时,您不知道要使用哪个子类。这一点很好。要使用它,您必须使用
@JsonTypeInfo
et
@JsonSubTypes
注释,但随后必须引入一个额外的鉴别器字段来区分它们。