如何将JSON字段的各种可能类型映射到POJO属性?

问题描述 投票:0回答:1

我有一个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"
   }
}

因此,错误字段可能是nullundefinedarrayobject。问题是,我只能在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。在这种情况下,如何对反序列化消息中的error字段分配的所有可能值并将其映射到POJO?

java json spring jackson rabbitmq
1个回答
0
投票

[如果您在json数据中没有任何标记来标识其来源并由此标识其形状,我将尝试将错误字段类型设置为object,如果它不起作用或不适合,则将其设置为“ json raw”,例如在How can I include raw JSON in an object using Jackson?的答案中进行了解释因此,您可以根据在运行时发现的内容,以适当的方式处理错误字段,并从上面详细介绍的预期内容中进行窥探。

© www.soinside.com 2019 - 2024. All rights reserved.