jackson - 从jsons的字符串列表中读取特定字段

时间:2017-08-16 15:35:40

标签: java json jackson jax-rs

我对杰克逊的世界很陌生,想从 jsons列表(这是第三方api的响应主体)中读取特定字段的值。

对于单个json,使用objectMapper工作正常。

        ObjectMapper mapper = new ObjectMapper();
        JsonNode rootNode = mapper.readTree(sampleString);
        JsonNode idNode = rootNode.path("id");
        System.out.println("id: "+ idNode.asText());

但我想解析 jsons列表(这是来自响应主体的字符串) 。例如,我收到了这个机构:

[  
{  
  "id":10,
  "firstName":"Jack",
  "primaryPhone":"9999999999",
  "email":"jack@me.com"
},
{  
  "id":4,
  "firstName":"Mark",
  "primaryPhone":"9999999991",
  "email":"mark@me.com"
},
{  
  "id":12,
  "firstName":"Susaan",
  "primaryPhone":"9999999992",
  "email":"susan23@me.com"
}
]

我想首先阅读id,如果我找到一个特定的id,请从该块返回一些其他信息。

例如,如果id=4,请阅读该人的firstNameemail

但我不确定如何解析json列表。

感谢任何建议/意见。

3 个答案:

答案 0 :(得分:2)

你可以尝试,

JsonNode array = objectMapper.readValue(sampleString, JsonNode.class);
 for(int i=0;i<array.length;i++){
    JsonNode jsonNode = array.get(i);
    JsonNode idNode = jsonNode.get("id");
    String id = idNode.asText();
    if(id.equals("4")){
        JsonNode firstNameNode = jsonNode.get("firstName");
        String firstName = firstNameNode.asText();
        System.out.println("firstName = " + firstName);
        JsonNode emailNode = jsonNode.get("email");
        String email = emailNode.asText();
        System.out.println("email = " + email);
        break;
    }
 }

答案 1 :(得分:1)

您可以使用Json Path

所以,查询将是这样的:

$[?(@.id == 4)].firstName

答案 2 :(得分:1)

您可以创建如下所示的POJO:

class Record {
    private Long id;
    private String firstName;
    //Getters and setters
}

json反序列化为这些POJOS的List,例如:

ObjectMapper mapper = new ObjectMapper();
List<Record> records = mapper.readValue("", new TypeReference<List<Record>>() { });

完成后,您可以使用stream过滤掉记录,例如:

List<Record> filtered = records.stream()
    .filter(r -> r.getId() = 12)
    .collect(Collectors.toList());