jackson Java + JSON:具有不同键名的匿名对象(键+值)列表

93ze6v8z  于 2022-11-08  发布在  Java
关注(0)|答案(2)|浏览(139)

也许这很简单,但我被卡住了...我有一个应用程序使用Sping Boot 和springframework.web.client.RestTemplate,所以后座上有Jackson自动做JSON工作。
我想用JSON反序列化REST输入,如下所示:

{
    "serial_no": 12345678,
    "last_dt": [
        {
            "lp": "2022-04-22T15:00:00"
        },
        {
            "bp": null
        },
        {
            "dp": "2022-04-22T00:00:00"
        },
        {
            "iv": "2022-04-22T00:05:11"
        }
    ]
}

请帮助我为这个模型创建POJO...如果我创建了以下类(用lombok简化):
第一个
反序列化 * 技术上 * 没问题-我得到了一个带有serialNo Long值的对象,不幸的是,它包含类LastDt的4个示例:第一个示例(lastDt[0])的字段“lp”具有值,并且“bp”、“dp”、“iv”为空;秒(lastDt[1]):“bp”有值,“lp”、“dp”、“iv”为空等等--只有一个值被设置,其他的都没有。这与我想要得到的结果相差甚远。正如你所看到的,有四个类似于对的匿名对象有不同的键名,所以我的模型是坏的,我知道这一点,但在试图创建其他的对象时被卡住了...有人能帮助我吗?

tkclm6bt

tkclm6bt1#

您可以使用@JsonAlias。其想法是在LastDt中有一个字段,并将所有可能的属性名称Map到该字段。

public class LastDt {

  @JsonAlias({"lp", "bp", "dp", "iv"})
  private String value;

  //getter and setters

  @Override
  public String toString() {
    return "LastDt{" +
            "value='" + value + '\'' +
            '}';
  }
}

不需要对Device进行任何更改。
还有一个简单的测试:

public class Temp {

  public static void main(String[] args) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    InputStream dataStream = getTheStream();
    Device device = mapper.readValue(dataStream, Device.class);
    System.out.println(device);
  }
}
ggazkfy8

ggazkfy82#

您应该在类中使用@JsonInclude(JsonInclude.Include.NON_NULL)

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class LastDt {
    @JsonProperty("lp")
    private String lp;
    @JsonProperty("bp")
    private String bp;
    @JsonProperty("dp")
    private String dp;
    @JsonProperty("iv")
    private String iv;
}

相关问题