【发布时间】:2019-10-20 18:19:04
【问题描述】:
我有一个 POJO,用于映射从 rabbitmq 接收到的值。这些消息是从我无法控制的其他第三方服务发送的。问题是这些服务不会以一致的方式发送某些字段。
例如在error字段的情况下,只有当第三方服务想要发送消息通知有错误时,该字段才会有信息。某些服务可能会以这种方式将其 JSON 消息发送到队列:
{
id: 123,
name: "PersonA",
error: null
}
还有一些服务可以通过这种方式发送 JSON 消息:
{
id: 123,
name: "PersonA",
error: []
}
还有一些服务可能会完全省略该字段:
{
id: 123,
name: "PersonA"
}
当然,如果出现错误,该错误字段将包含其中的字段:
{
id: 123,
name: "PersonA",
error: {
message: "Cannot find PersonA"
}
}
因此,错误字段有可能是null、undefined、array 或object。
问题是,我只能在我的 POJO 中为 error 字段定义一个类型。
public class MyMessage {
private int id;
private MessageError error;
private String name;
@JsonCreator
public MyMessage(
@JsonProperty("id") int id,
@JsonProperty("error") MessageError error, // error is a MessageError object already but what is sent in could be null, undefined, an array or an object
@JsonProperty("name") String name
) {
this.id = id;
this.error = error;
this.name = name;
}
}
public class MessageError {
private String message;
@JsonCreator
public MessageError(
@JsonProperty("message") String message
) {
this.message = message;
}
}
我正在与 Jackson 一起使用 Spring。
在这种情况下,当它被反序列化时,如何处理和映射可能分配给消息中 error 字段的所有可能值到 POJO?
【问题讨论】:
-
我认为最好的方法是使用
JsonNode作为error -
同意@Deadpool 的评论。顺便说一句,你所有的 JSON 字符串都不合法,每个字段的键名都应该用双引号括起来。
标签: java json spring jackson rabbitmq