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

标签 java json spring jackson rabbitmq

我有一个 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 和 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/

相关文章:

java - producteev4j 实现

java - 为什么子类构造函数必须显式调用父类(super class)构造函数?

java - Gson -> 导入带有对象的 JSON

c# - 如何序列化我的类(class)以通过 retrofit 将其作为 urlencoded 发送

java - 连接Spring Boot-MySql : Public Key Retrieval is not allowed

xml - 条件依赖注入(inject)

spring - 如何测试使用 spring @values 注释设置属性的类?

java - 让家庭 Intent 转向特定的应用程序 Activity ?

java - 如何使用GSON将json对象数组解析为JAVA二维数组?

python json 类型错误 : string indices must be integers