簡體   English   中英

將 JSON 響應序列化為 Java Object 時出現問題

[英]Issue when serializing JSON response into Java Object

我是 Java 的新手。 I am trying to serialize a JSON response into a Java Object (UserData) but i am having some issues with the empty and null fields (even, i do not know the type of part of this data).

JSON 響應如下:

    "id": 88,
    "username": "palomajim",
    "name": "Paloma Jimeno",
    "language": "en",
    "height": null,
    "isActive": true,
    "statistics": null,
    "tablets": [],
    "category": null,
    "role": null,
    "senior": [],
    "projects": null
}

如您所見,null 和空列表字段太多。 我對創建一個 Java Object 很感興趣,它只考慮“id”、“用戶名”、“名稱”、“語言”和“isActive”字段,忽略空列表和 Z37A6259CC0C1DAE299ZBDBD48DBD48666666。

目前,我的客戶 class 如下:

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
 
@SpringBootApplication
public class RESTClient {

    static final String URL_NLP = "https://xxx/senior?by_senior_id=";
 
    public UserData getUserData(String idUser) {
 
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("x-api-key", "xxx");

        HttpEntity<User> entity = new HttpEntity<User>(headers);

        // RestTemplate
        RestTemplate restTemplate = new RestTemplate();

        // Send request with GET method, and Headers.
        ResponseEntity<UserData> response = restTemplate.exchange(URL_NLP+idUser, HttpMethod.GET, entity, UserData.class);

        HttpStatus statusCode = response.getStatusCode();
        System.out.println("Response Satus Code: " + statusCode);
 
        // Status Code: 200
        if (statusCode != HttpStatus.OK) {
            return null;     
        }

        // Response Body Data
        UserData u = response.getBody();
            
        System.out.println("User name: " + u.getName());

        return u;

    }

而代表UserData的class(object序列化JSON響應中的信息如下):

import java.io.Serializable;
import java.util.List;
import java.util.Objects;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class UserData implements Serializable {

    private Integer id;
    private String username;
    private String name;
    private String language;
    private Boolean isActive;
    

    public UserData() {
    }

    public UserData(Integer id, String username, String name, String language) {
        this.id = id;
        this.username = username;
        this.name = name;
        this.language = language;

    }

    public Integer get_id() {
        return this.id;
    }

    public void set_id(Integer id) {
        this.id = id;
    }

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

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

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

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

    public String getLanguage() {
        return this.language;
    }

    public void setLanguage(String language) {
        this.language = language;
    }

    public boolean getIsActive(){return this.isActive; }

    public void setIsActive(){this.isActive = isActive;}

    public UserData id(Integer id) {
        this.id = id;
        return this;
    }

    public UserData username(String username) {
        this.username = username;
        return this;
    }

    public UserData name(String name) {
        this.name = name;
        return this;
    }

    public UserData language(String language) {
        this.language = language;
        return this;
    }


    @Override
    public boolean equals(Object o) {
        if (o == this)
            return true;
        if (!(o instanceof UserData)) {
            return false;
        }
        UserData userData = (UserData) o;
        boolean b = Objects.equals(id, userData.id) && Objects.equals(name, userData.name)
                && Objects.equals(username, userData.username) && Objects.equals(language, userData.language) ;
        return Objects.equals(id, userData.id) && Objects.equals(name, userData.name) && Objects.equals(username, userData.username)
                && Objects.equals(language, userData.language);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, username, name, language);
    }

    @Override
    public String toString() {
        return "{" +
            " id='" + get_id().toString() + "'" +
            ", username='" + getUsername() + "'" +
            ", name='" + getName() + "'" +
            ", language='" + getLanguage() + "'" +
            ", isActive='" + "" + "'" +
            "}";
    }
}

但是,我在 RESTClient class 中收到以下錯誤。

Method threw 'java.lang.NullPointerException' exception. Cannot evaluate org.springframework.http.ResponseEntity.toString()

你知道我做錯了什么嗎? 我應該在 UserData class 中以另一種方式進行嗎? 我不知道 null 字段和空列表的類型,因此無法在 UserData class 的構造函數中考慮它們。 你可以幫幫我嗎?

該異常不言自明,您在 toString 方法中有一個 null 指針異常。 連接字符串時無需在 Integer 上使用 a.toString() ,您可以像這樣更改 toString() 方法:

@Override
public String toString() {
    return "{" +
        " id='" + get_id() + "'" +
        ", username='" + getUsername() + "'" +
        ", name='" + getName() + "'" +
        ", language='" + getLanguage() + "'" +
        ", isActive='" + "" + "'" +
        "}";
}

如果我們正在談論而不是更復雜的 object,為了避免 null 指針使用String.valueOf(object) 如果 object 是 null,則此特定方法將打印“null”,並且如果不是 objectC4B666F8911C4B6666C4BD37A6ZDAE290C18DFF07A6Z866C40

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM