如何让Jackson将JSON反序列化为使用工厂示例化的通用 Package 器中 Package 的对象?

knsnq2tg  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(132)

考虑这个JSON

{
"data": 
    {
     "id": 1,
     "name": "Sergey"
    }
}

假设,我希望它被反序列化为

Data<Person> person;

假设Person是一个具有规范构造函数的简单类

public class Person {
    private int id;
    private String name;
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

假设Data有点棘手:它是通用的,并且它的示例化依赖于静态工厂方法。它的无参数构造函数是private,不应该在其他任何地方使用

public final class Data<T> {

    private final T data;

    private Data(T data) {
        this.data = data;
    }

    public static <T> Data<T> build(T data) {
        return new Data<>(data);
    }
}

如何让Jackson以最简洁、最有效的方式执行反序列化?this Baeldung article是否提供了此问题的示例性解决方案?我听说它现在偶尔使用AI生成的文本,所以我想确保我不能以更短更清晰的方式实现它

koaltpgm

koaltpgm1#

**步骤1.**将所有参数和工厂方法标注为@JsonCreator

public class Person {
    private int id;
    private String name;

    @JsonCreator
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
}
public final class Data<T> {

    private final T data;

    private Data(T data) {
        this.data = data;
    }
    
    @JsonCreator
    public static <T> Data<T> build(T data) {
        return new Data<>(data);
    }
}

**步骤2.**注册ParameterNamesModule。这将帮助Jackson将构造函数/工厂方法参数自动Map到它们的同名字段

new ObjectMapper().registerModule(new ParameterNamesModule());

**步骤3.**确保创建并传递TypeReference对象

TypeReference<Data<Person>> typeReference =
                new TypeReference<>() {};
        Data<Person> deserializedPersonJson =
                objectMapper.readValue(personJson, typeReference);

相关问题