将具有多个条目的JSON映射到数组

时间:2017-01-12 09:27:56

标签: java json jackson mapping

我有一个JSON文件,其中有多个条目具有相同的属性名称,但属性值不同,例如:

{
  "name" : { "first" : "A", "last" : "B" },
  "gender" : "MALE",
  "married" : false,
  "noOfChildren" : 2
},
{
  "name" : { "first" : "C", "last" : "D" },
  "gender" : "FEMALE",
  "married" : true,
  "noOfChildren" : 1
}

应该映射的类是:

public class Human {

private Name name;
private String gender;
private int age;

<getter, setters etc>

}

编辑: 服务代码是:

List<Human> humans = null;
ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

try {

    humans= objectMapper.readValue(json, new TypeReference<List<Human>>(){});

} catch (IOException e) {
    e.printStackTrace();
}

JSON是从HTTP实体解析的,格式正确,现在我添加了答案中建议的注释屁股。

正如您所看到的,它们有一些共同的属性,但在其他属性方面有所不同,我想映射这些常见字段。是否可以通过这种方式映射JSON?我已经尝试将JSON映射到JsonNodes的集合/列表/数组,但是我一直在获得关于反序列化的错误,而映射只有一个JSON条目的实例工作得很好。还有另一种方法吗?

2 个答案:

答案 0 :(得分:1)

使用

@JsonIgnoreProperties(ignoreUnknown = true)
public class Human {
    private Name name;
    private String gender;
    // getters, settets, default constructor
}

或者,如果您使用的是Lombok,那么它将是

@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Human {
    private Name name;
    private String gender;
}

答案 1 :(得分:1)

使用

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

将json反序列化为POJO类。

您提供的JSON将提供以下错误,因为它不是有效错误。

Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

有效的Json会是这样的:

[
  {
    "name": {
      "first": "A",
      "last": "B"
    },
    "gender": "MALE",
    "married": false,
    "noOfChildren": 2
  },
  {
    "name": {
      "first": "C",
      "last": "D"
    },
    "gender": "FEMALE",
    "married": true,
    "noOfChildren": 1
  }
]