Я использую спящий режим для запроса записей пользователей из моей базы данных, как показано:

String hql = "SELECT U FROM User U";
List<User> users = this.em.createQuery(hql).getResultList();

Как преобразовать возвращенные данные в json, как показано в формате ниже:

enter image description here

Если пользователей не найдено, я хочу, чтобы мой json выглядел, как показано ниже:

enter image description here

Я хочу проделать некоторые манипуляции с полученными данными перед созданием данных json. Поэтому я хочу избежать прямой передачи списка, как показано ниже:

 String data = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(users);
-1
rufusy 14 Сен 2020 в 17:51

2 ответа

Лучший ответ

Если вы используете библиотеку Джексона, вам следует реализовать простой объект DTO, содержащий список User / UserDto, заглушку для пустого списка с настраиваемым свойством msg, а затем создать соответствующий экземпляр в зависимости от по имеющимся результатам.

Также вы можете установить порядок свойств в сгенерированном JSON с помощью аннотации @JsonPropertyOrder.

public class UserDto {
    private final String name;
    private final String email;

    public UserDto(String name, String email) {
        this.name = name;
        this.email = email;
    }
    public String getName() { return this.name; }
    public String getEmail() { return this.email; }
}

@JsonPropertyOrder({ "usersFound", "users" })
public class ListUserDto {
    private final List<UserDto> users;

    public ListUserDto(List<UserDto> users) {
        this.users = users;
    }

    public List<UserDto> getUsers() {
        return new ArrayList<>(users);
    }

    @JsonProperty("usersFound")
    public boolean isUsersFound() {
        return true;
    }
}

@JsonPropertyOrder({ "usersFound", "msg" })
@JsonIgnoreProperties(value = {"users"})
public class EmptyListUserDto extends ListUserDto {
    public EmptyListUserDto() {
        super(Collections.emptyList());
    }

    public String getMsg() {
        return "No User Found";
    }

    @JsonProperty("usersFound")
    public boolean isUsersFound() {
        return false;
    }
}


// -------------
public ListUserDto buildUserListJson(List<User> users) {
//    String hql = "SELECT U FROM User U";
//    List<User> users = this.em.createQuery(hql).getResultList();

    if (null == users || users.isEmpty()) {
        return new EmptyListUserDto();
    }
    return new ListUserDto(
            users.stream()
                 .map(u -> new UserDto(u.getName(), u.getEmail()))
                 .collect(Collectors.toList())
    );
}

Тестовый код:

ObjectWriter writer = new ObjectMapper().writerWithDefaultPrettyPrinter();

System.out.println(writer.writeValueAsString(buildUserListJson(
    List.of(new User("jack", "jack@mail.com"), new User("john", "john@mail.com"))
)));

System.out.println("null -> " + writer.writeValueAsString(buildUserListJson(null)));

System.out.println("empty -> " + writer.writeValueAsString(buildUserListJson(Collections.emptyList())));

Выход:

{
  "usersFound" : true,
  "users" : [ {
    "name" : "jack",
    "email" : "jack@mail.com"
  }, {
    "name" : "john",
    "email" : "john@mail.com"
  } ]
}
null -> {
  "usersFound" : false,
  "msg" : "No User Found"
}
empty -> {
  "usersFound" : false,
  "msg" : "No User Found"
}
0
Alex Rudenko 14 Сен 2020 в 16:10

Вы можете просто пошагово собрать json:

На первом этапе я бы рекомендовал создать метод в классе User, который дает имя и адрес электронной почты пользователя как json.

public class User{

    ...
 
    public String getJsonUserEmail(){

        return "{\"name\": \"" + this.getName() + "\", " +
                "\"email\": \"" + this.getEmail() + "\"}"

    }

    ...

}


Затем преобразуйте всех пользователей в json и создайте последний json.

public static void main(String[] args) {

    String finalJson = "{";

    if(!users.isEmpty()){

        finalJson += "\"usersFound\": true, ";
                
        //transform every user to json
        //{"name": "name1", "email": "email1"}
        List<String> usersJson = users.stream()
                                      .map(e -> e.getJsonUserEmail())
                                      .collect(Collectors.toList());

        //join all jsons
        //{"name": "name1", "email": "email1"}, {"name": "name2", "email": "email2"}, ...
        String usersJsonJoin = String.join(", ", usersJson);

        finalJson += "\"users\": [" + usersJsonJoin + "]";

    }else{

        finalJson += "\"usersFound\": false, ";
        finalJson += "\"msg\": \"No users found\"";

    }

    finalJson += "}";

}
0
KunLun 14 Сен 2020 в 15:36