Группировка и создание Json в Java эффективно - PullRequest
0 голосов
/ 18 апреля 2020

Ниже приведены данные, содержащие pojo

class user{

private string userId;
private string role;
private string accessCode;

}

Из БД я получаю ответ ниже, так как один пользователь может иметь несколько кодов доступа

"data": [
    {
      "userId": "userId1",
      "role": "admin",
      "accesscode": "000008"
    },
     {
      "userId": "userId1",
      "role": "admin",
      "accesscode": "000007"
    },
{
      "userId": "userId2",
      "role": "analyst",
      "accesscode": "000001"
    }
]

Ожидаемый вывод как Окончательный Json из конечная точка отдыха

"data": [
    {
      "userId": "userId1",
      "role": "admin",
      "accesscode": "000008","000007"  // group all access code. 
    }
{
      "userId": "userId2",
      "role": "analyst",
      "accesscode": "000001"
    }
]

Каков наилучший способ достичь этого. Любые указатели

1 Ответ

1 голос
/ 18 апреля 2020

Вот один из способов сделать это без использования POJO:

String input = "{" +
               "  \"data\": [\n" + 
               "    {\n" + 
               "      \"userId\": \"userId1\",\n" + 
               "      \"role\": \"admin\",\n" + 
               "      \"accesscode\": \"000008\"\n" + 
               "    },\n" + 
               "    {\n" + 
               "      \"userId\": \"userId1\",\n" + 
               "      \"role\": \"admin\",\n" + 
               "      \"accesscode\": \"000007\"\n" + 
               "    },\n" + 
               "    {\n" + 
               "      \"userId\": \"userId2\",\n" + 
               "      \"role\": \"analyst\",\n" + 
               "      \"accesscode\": \"000001\"\n" + 
               "    }\n" + 
               "  ]\n" +
               "}";
ObjectMapper mapper = new ObjectMapper();
Map<String, List<Map<String, String>>> data = mapper.readValue(input,
        new TypeReference<Map<String, List<Map<String, String>>>>() {/**/});

Map<String, List<Map<String, Object>>> combinedData = new HashMap<>();
combinedData.put("data", data.get("data").stream()
        .collect(Collectors.groupingBy(
                u -> Arrays.asList(u.get("userId"), u.get("role")),
                Collectors.mapping(u -> u.get("accesscode"), Collectors.toList())))
        .entrySet().stream()
        .map(e -> {
            Map<String, Object> user = new LinkedHashMap<>();
            user.put("userId", e.getKey().get(0));
            user.put("role", e.getKey().get(1));
            user.put("accesscode", e.getValue());
            return user;
        })
        .collect(Collectors.toList()));

String output = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(combinedData);
System.out.println(output);

Вывод

{
  "data" : [ {
    "userId" : "userId2",
    "role" : "analyst",
    "accesscode" : [ "000001" ]
  }, {
    "userId" : "userId1",
    "role" : "admin",
    "accesscode" : [ "000008", "000007" ]
  } ]
}
...