gpt4 book ai didi

java - Jackson - 将 json 反序列化为通用类型

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

我有一个如下所示的模型:

@JsonIgnoreProperties(ignoreUnknown = true)
public class InputMessage<T> {

@JsonProperty("UUID")
private String UUID;

@JsonProperty("MessageType")
private String messageType;

@JsonProperty("KeyData")
private T keyData;

...

getters/setters
}

这将位于从任意客户端调用的库中,因此 KeyData 字段具有通用类型。如果我尝试从客户端代码进行如下调用,我会收到 ClassCastException java.lang.ClassCastException: class java.util.LinkedHashMap Cannot be Cast to class model.KeyData:

<小时/>

编辑:

尝试使用constructParametricType()建议,但总是出错。

ObjectMapper objectMapper = new ObjectMapper();
JavaType type = objectMapper.getTypeFactory().constructParametricType(InputMessage.class, KeyData.class);
KeyData keyData = objectMapper.readValue(inputMessage.getKeyData().toString(), type);

我尝试反序列化的 json 如下所示:

{
UUID: 9bae9a6a-5553-4716-8a85-995f36df7732,
KeyData: {
CNSM_ID: 2,
LGCY_SRC_ID: 123,
PARTN_NBR: 1,
PCD_EFF_DT: 2019-01-01,
SRC_CD: AB
},
MessageType: provider_selection,
Partition: 3,
Rows: [
{
Type: l_cov_prdt_pcd_w_srch,
SchemaID: 2,
Value: base64encoded value
}
]
}

我用来反序列化 json 的库是 com.fasterxml.jackson.core:jackson-databind:2.9.8

任何有关此问题的帮助将不胜感激。

最佳答案

当您将 JSON 反序列化为泛型类时,Jackson 无法猜测所使用的泛型类型,因为这不是 JSON 中存在的信息。
当它不知道如何反序列化字段时,它会使用 java.util.LinkedHashMap作为目标。

您想要的是通用类型,例如:

InputMessage<KeyData> inputMessage = ...;
KeyData keyData = inputMessage.getKeyData();

解决这个问题的一个优雅方法是定义 Jackson JavaType通过指定预期的泛型来为类指定预期的泛型。
TypeFactory.constructParametricType(Class parametrized, Class... parameterClasses)允许这样做。

假设你想反序列化为InputMessage<KeyData> ,你可以这样做:

JavaType type = mapper.getTypeFactory().constructParametricType(InputMessage.class, KeyData.class);
InputMessage<KeyData> keyData = mapper.readValue(json, type);

关于您的评论:

The library code with the generic type knows nothing about the KeyData class, so I assume it belongs in the client code?

库不需要知道此类,但客户端应该传递该类以正确执行反序列化并向客户端返回通用实例而不是原始类型。

例如,客户端可以通过以下方式使用该库:

InputMessage<KeyData> inputMessage = myJsonLibrary.readValue("someValueIfNeeded", KeyData.class);

关于java - Jackson - 将 json 反序列化为通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57064568/

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