我有一个 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;
}
}
我正在使用 Spring 和 Jackson。
在这种情况下,当 POJO 反序列化时,如何处理和映射可能分配给消息中 error
字段的所有可能值?
最佳答案
如果 json 数据中没有任何标记来识别其来源及其形状,我会尝试将错误字段类型设置为对象,如果它不起作用或不适合,则设置为“json raw”,如 How can I include raw JSON in an object using Jackson? 的答案中所述。 因此,您可以根据在运行时发现的内容以适当的方式处理错误字段,从上面详述的预期内容中查看。
关于java - 如何将 JSON 字段的各种可能类型映射到 POJO 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58475938/