如何将数组中的值映射到属性

时间:2020-07-08 21:21:18

标签: java json jackson

我正在尝试解析json并在数组中获取值-

 {
  "hits": {
    "hits": [
      {
          "name": [
            {
              "family": "Doe",
              "given": "Jon",
              "middle": "Smith",
              "use": "Commercial"
            }
          ]
      }
    ]
  }
}

下面是我的情话

private String fstNm;

 public String getFstNm() { return fstNm; }

    @JsonProperty("name")
    public void setFstNm(Map<String,Object>name) {
        this.fstNm = (String) name.get("given");

    }

但是由于某种原因,它无法正常工作,我从START_OBJECT令牌中提取了Cannot deserialize instance of java.lang.String

我将不胜感激。

2 个答案:

答案 0 :(得分:2)

基于JSON,名称实际上是一个列表,因此您应该映射:

@JsonProperty("name")
public void setFstNm(List<Map<String, Object>> name) {
    this.fstNm = (String) name.get(0).get("given");
}

这是从数组的第一个位置“赋予”属性。当然,您需要先检查列表是否为空,以及是否真的想要第一个。

[更新]

对于上面指定的新JSON,解析的另一种方法是:

@JsonProperty("hits")
public void setFstNm(Map<String, List<Map<String, List<Map<String, Object>>>>> hits) {
    this.fstNm = (String) hits.get("hits").get(0).get("name").get(0).get("given");
}

或者,如果您使用ObjectMapper进行解析,则可以轻松阅读:

JsonNode jsonNode = new ObjectMapper().readTree(<<JSON>>);
String givenName = jsonNode.get("hits").get("hits").get(0)
    .get("name").get(0).get("given").asText();

答案 1 :(得分:0)

private String fstNm;

  private List<Map<String,Object>> name;

public String getFstNm() { return fstNm; }

 @JsonProperty("hits")
    public void setFstNm(List<Map<String, Object>> hits) {

        name = (List) hits.get(0).get("name");

        this.fstNm= (String) name.get(0).get("given");
        

    }