Mahyar
Mahyar

Reputation: 1121

jackson - read specific field from string list of jsons

I'm pretty new to world of jackson, and wanted to read the value of specific field from list of jsons (which is a response body of third-party api).

for a single json, using objectMapper works fine.

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

But I want to parse list of jsons (which is a string coming from a response body) .So for example I receive this body:

[  
{  
  "id":10,
  "firstName":"Jack",
  "primaryPhone":"9999999999",
  "email":"[email protected]"
},
{  
  "id":4,
  "firstName":"Mark",
  "primaryPhone":"9999999991",
  "email":"[email protected]"
},
{  
  "id":12,
  "firstName":"Susaan",
  "primaryPhone":"9999999992",
  "email":"[email protected]"
}
]

I want to read the ids first, and if I find a specific id, return some other info from that block.

For example if id=4, read the firstName and email of that person.

But I'm not sure how to parsee list of json.

Any suggestions/comments is appreciated.

Upvotes: 2

Views: 1858

Answers (3)

Rakesh KR
Rakesh KR

Reputation: 6527

You can try,

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

Upvotes: 2

Darshan Mehta
Darshan Mehta

Reputation: 30819

You can create a POJO like the one below:

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

And deserialise the json into List of these POJOS, e.g.:

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

Once done, you can filter out the records with stream, e.g.:

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

Upvotes: 1

alayor
alayor

Reputation: 5025

You can use Json Path.

So, the query would be something like this:

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

Upvotes: 1

Related Questions