You have received great answers, but in case the exact specified JSON output is needed, there's another thing we need to do.
Let's first create RoleLevel class:
@Getter
public class RoleLevel {
String roleName;
String name;
}
Then we can group by name:
ObjectMapper mapper = new ObjectMapper();
String jsonStr = "[{\"roleName\": \"driver\", \"name\": \"Hub\"},{\"roleName\": \"hoc\", \"name\": \"Org\"},{\"roleName\": \"hubManager\", \"name\": \"Hub\"}]";
List<RoleLevel> roleLevels = mapper.readValue(jsonStr, new TypeReference<List<RoleLevel>>(){});
Map<String, List<String>> nameToRoles = roleLevels.stream()
.collect(Collectors.groupingBy(RoleLevel::getName, Collectors.mapping(RoleLevel::getRoleName, Collectors.toList())));
System.out.println(mapper.writeValueAsString(nameToRoles));
But the output JSON is not exactly the expected JSON output:
{
"Hub": ["driver", "hubManager"], // no "role" field
"Org": ["hoc"] // no "role" field
}
To fix this we need to create a Person class:
@AllArgsConstructor
@Getter
@Setter
public class Person {
List<String> role;
}
then do:
Map<String, Person> personToRoles = nameToRoles.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> new Person(entry.getValue())));
System.out.println(mapper.writeValueAsString(personToRoles));
Output:
{
"Hub": {
"role": ["driver", "hubManager"]
},
"Org": {
"role": ["hoc"]
}
}
Map<String, List<String>>, you can make use of Nirmal's answer with aCollectors.mappingdownstream added to it.