gpt4 book ai didi

java - Jackson 有状态反序列化

转载 作者:行者123 更新时间:2023-12-01 11:17:31 25 4
gpt4 key购买 nike

我有一个如下所示的 JSON:

{
systemId: 7
name: "Phil"
data: "XYZ"

pointers: [
{
systemId: 23
name: "Peter"
},
{
systemId: 27
name: "Jeroen"
}
]
}

在与上述 JSON 等效的 POJO 中,所有字段都是最终字段。现在,在反序列化过程中,我希望能够在 Jackson 在 POJO 上设置 systemId 字段之前对其进行修改。此外,更改后的 systemId 实际上将由有状态对象作为 JSON 中当前 systemId 的函数提供。例如,要在反序列化 POJO 上设置的新 systemId 可能由类的实例提供,如下所示:

public class SystemIdProvider {
...
public long getNewSystemId(long oldSystemId) {
// do something with the oldSystemId and
// the current state of this object to get the newSystemId
return newSystemId;
}
}

有没有一种方法可以在反序列化 JSON 时向 Jackson 提供上述类的实例,并让 Jackson 使用此对象来获取 newSystemId,然后再将其设置在它创建的 POJO 上?

请注意,上面的 JSON 只是实际 JSON 的一小段,因此可能包含数百个如上所述的此类对象。我想为每个反序列化提供一个新的 SystemIdProvider 类实例,因为它维护的“状态”也基于它迄今为止遇到的 systemId。因此,每次反序列化都需要从干净的状态开始。

欢迎任何意见。

最佳答案

您需要为此编写一个自定义反序列化器。假设您有以下 POJO:

public class MyPojo {

private final long systemId;
private final String foo;

public MyPojo(long systemId, String foo) {
this.systemId = systemId;
this.foo = foo;
}

// getters and other methods
}

systemId 字段编写自定义反序列化器:

public class SystemIdDeserializer extends StdDeserializer<Long> {

public SystemIdDeserializer() {
super(Long.class);
}

@Override
public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
SystemIdProvider systemIdProvider = (SystemIdProvider) ctxt.getAttribute("systemIdProvider");
Long oldSystemId = _parseLong(jp, ctxt);
return systemIdProvider.getNewSystemId(oldSystemId);
}
}

systemId字段上使用@JsonDeserialize注释来注册反序列化器:

@JsonDeserialize(using = SystemIdDeserializer.class)
private final long systemId;

要使 SystemIdProviderDeserializationContext 中可用,请像这样调用 Jackson 的映射器:

ObjectMapper mapper = new ObjectMapper();
MyPojo deserialized = mapper.reader(MyPojo.class)
.withAttribute("systemIdProvider", new SystemIdProvider())
.readValue(json);

关于java - Jackson 有状态反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31635581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com