JsonMappingException: н / д при попытке десериализации файла JSON - PullRequest
1 голос
/ 07 октября 2019

У меня есть класс User и файл Json, содержащий массив Users. При попытке десериализации этих пользователей и получения списка я получаю исключение JsonMappingException, я не понимаю, в чем дело.

Это мой класс пользователя:

public class User {

private StringProperty username;
private StringProperty password;

private StringProperty name;
private StringProperty surname;
private StringProperty email;
private StringProperty company;
private StringProperty phone;

private BooleanProperty canMonitorize;
private BooleanProperty canCreateProject;
private BooleanProperty canOpenProject;
private BooleanProperty admin;

public User() {}

public User(String user, String pass, String name, String surname, String email, String company, String phone,
        boolean monitorize, boolean createP, boolean openP, boolean admin) {

    this.username = new SimpleStringProperty(user);
    this.password = new SimpleStringProperty(pass);

    this.name = new SimpleStringProperty(name);
    this.surname = new SimpleStringProperty(surname);
    this.email = new SimpleStringProperty(email);
    this.company = new SimpleStringProperty(company);
    this.phone = new SimpleStringProperty(phone);

    this.canMonitorize = new SimpleBooleanProperty(monitorize);
    this.canCreateProject = new SimpleBooleanProperty(createP);
    this.canOpenProject = new SimpleBooleanProperty(openP);
    this.admin =  new SimpleBooleanProperty(admin);

}

public String getUsername() {
    return username.get();
}

public void setUsername(String username) {
    this.username.set(username);
}

public String getPassword() {
    return password.get();
}

public void setPassword(String password) {
    this.password.set(password);
}

public String getName() {
    return name.get();
}

public void setName(String name) {
    this.name.set(name);
}

public String getSurname() {
    return surname.get();
}

public void setSurname(String surname) {
    this.surname.set(surname);
}

public String getEmail() {
    return email.get();
}

public void setEmail(String email) {
    this.email.set(email);
}

public String getCompany() {
    return company.get();
}

public void setCompany(String company) {
    this.company.set(company);
}

public String getPhone() {
    return phone.get();
}

public void setPhone(String phone) {
    this.phone.set(phone);
}

public boolean canMonitorize() {
    return canMonitorize.get();
}

public void setCanMonitorize(boolean canMonitorize) {
    this.canMonitorize.set(canMonitorize);
}

public boolean canCreateProject() {
    return canCreateProject.get();
}

public void setCanCreateProject(boolean canCreateProject) {
    this.canCreateProject.set(canCreateProject);
}

public boolean canOpenProject() {
    return canOpenProject.get();
}

public void setCanOpenProject(boolean canOpenProject) {
    this.canOpenProject.set(canOpenProject);
}

public boolean isAdmin() {
    return admin.get();
}

public void setAdmin(boolean isAdmin) {
    this.admin.set(isAdmin);
}
}

И этопример файла Json:

[{"username":"admin","password":"blablabla","name":"admin","surname":"admin","email":"admin@admin.com","company":"admin","phone":"admin","admin":true}]

Этот метод должен получить список пользователей:

public static List<User> getUsers(String jsonArrayStr) {

    ObjectMapper mapper = new ObjectMapper();

    List<User> ret;
    try {

        User[] userArray = mapper.readValue(jsonArrayStr, User[].class);
        ret = new ArrayList<>(Arrays.asList(userArray));

    } catch (IOException e) {
        return new ArrayList<User>();
    }

    return ret;

}

Ошибка, которую я получаю при выполнении кода:

com.fasterxml.jackson.databind.JsonMappingException: N/A (through reference chain: object.User["username"])

1 Ответ

1 голос
/ 07 октября 2019

Если у вас есть конструктор public 0-args, он используется по умолчанию для создания нового экземпляра POJO. Но в вашем случае вы не должны позволять создавать экземпляр с конструктором по умолчанию, потому что все внутренние поля null и когда Jackson пытается установить первое свойство, username, NullPointerException выбрасывается. Попробуйте объявить ваш конструктор, как показано ниже, и удалите его по умолчанию:

@JsonCreator
public User(@JsonProperty("username") String user,
            @JsonProperty("password") String pass,
            @JsonProperty("name") String name,
            @JsonProperty("surname") String surname,
            @JsonProperty("email") String email,
            @JsonProperty("company") String company,
            @JsonProperty("phone") String phone,
            @JsonProperty("monitorize") boolean monitorize,
            @JsonProperty("createP") boolean createP,
            @JsonProperty("openP") boolean openP,
            @JsonProperty("admin") boolean admin) {
            //your code;
}

Кроме того, ваш getUsers метод может выглядеть следующим образом:

public static List<User> getUsers(String json) {
    final ObjectMapper mapper = new ObjectMapper();

    try {
        final JavaType collectionType = mapper.getTypeFactory().constructCollectionType(List.class, User.class);
        return mapper.readValue(json, collectionType);
    } catch (IOException e) {
        //You should not hide exceptions. Try to log it at least.
        //But probably application should not start when app configuration is missing or wrong.
        e.printStackTrace();
        return Collections.emptyList();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...