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



也许这很简单,但我卡住了…我有一个应用程序使用Spring 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简化):

@Data
public class LastDt {
@JsonProperty("lp")
private String lp;
@JsonProperty("bp")
private String bp;
@JsonProperty("dp")
private String dp;
@JsonProperty("iv")
private String iv;
}
@Data
public class Device {
@JsonProperty("serial_no")
private Long serialNo;
@JsonProperty("last_dt")
private List<LastDt> lastDt;
}

反序列化在技术上是好的-我得到了一个具有serialNo Long值的对象,不幸的是列出了4个类LastDt的实例:第一个实例(LastDt[0])具有字段"lp"带有value和" b", "dp", "iv"零;second (lastDt[1]): "bp"带有value和" l", "dp", "iv"空等等——只设置了一个值,其他的不设置。这远不是我想要的。正如你所看到的,有四个类似于对的匿名对象,它们有不同的键名,所以我的模型很糟糕,我知道这一点,但在尝试创建其他对象时却卡住了……有人能帮我吗?

您可以使用@JsonAlias。我们的想法是在LastDt中有一个字段,所有可能的属性名称都映射到该字段。

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);
}
}

你应该在你的类中使用@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;
}

最新更新