[英][solved]How to use Jackson ObjectMapper to deserialize json list with type metadata?
[英]Java, How can I use Jackson ObjectMapper to deserialize a double nested json list
我正在尝试使用以下结构反序列化json对象:
{"results":{
"Assessments":{
"Assessment":[
{
"assessor":"",
"buildingName":"Emerald Palace Project",
"certBody":"",
...
顶层是一个名为“结果”的实体,其中包含“评估”,只是“评估”的列表/数组。
我尝试了多种映射器配置组合,例如:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
但是,无论我如何进行切换,我始终会得到带有空评估的Results对象。
这是我使用Lombok的对象类。
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
static class Results {
private Assessments assessments;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
static class Assessments {
private List<Assessment> assessments;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Assessment {
private int parentId;
private String stage;
private String notes;
private String rating;
private String scheme;
}
我觉得我一定错过了一块。
任何见识将不胜感激。
只是要清楚一点:您写道
[…]“评估”只是“评估”的列表/数组。
并且您的POJO反映出……那么您的JSON必须是……
{"results":{
"Assessments":{
[
{
"assessor":"",
"buildingName":"Emerald Palace Project",
"certBody":"",
...
…代替…
{"results":{
"Assessments":{
"Assessment":[
{
"assessor":"",
"buildingName":"Emerald Palace Project",
"certBody":"",
...
请直接在“评估”中关注列表。 另外请注意,您的POJO字段是小写的,因此必须是JSON键。
因此,要将POJO与JSON匹配,您可以使用多种选择:
@JsonProperty("field-name")
来匹配您的JSON密钥 但是在每种情况下,您都必须了解有关评估/评估列表的当前冲突。
因此,由于我必须使用第三方API给我的json,因此无法更改json。
这就是我的工作方式。
首先,我必须将评估对象更改为具有唯一名称的列表。 “ assessment”而不是“ assessments”,因为这是json响应中的拼写方式。
@Getter
@Setter
@NoArgsConstructor
static class Assessments {
private List<Assessment> assessment;
}
此外,我还设置了ObjectMapper来忽略大小写和未知属性。 确保使用com.fasterxml.jackson.databind.ObjectMapper。
private static ObjectMapper getJsonMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
return mapper;
}
但是最大的变化是引入了容器类。
@Getter
@Setter
@NoArgsConstructor
private static class JsonContainer {
private Results results;
}
该类是必需的,因为它包含顶级json对象“ Results”。
在完成这些更改之后,我将Java对象置于预期的状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.