簡體   English   中英

Jackson 序列化:忽略空值(或 null)

[英]Jackson serialization: ignore empty values (or null)

我目前正在使用傑克遜 2.1.4,當我將對象轉換為 JSON 字符串時,我在忽略字段時遇到了一些麻煩。

這是我的類,它充當要轉換的對象:

public class JsonOperation {

public static class Request {
    @JsonInclude(Include.NON_EMPTY)
    String requestType;
    Data data = new Data();

    public static class Data {
        @JsonInclude(Include.NON_EMPTY)
        String username;
        String email;
        String password;
        String birthday;
        String coinsPackage;
        String coins;
        String transactionId;
        boolean isLoggedIn;
    }
}

public static class Response {
    @JsonInclude(Include.NON_EMPTY)
    String requestType = null;
    Data data = new Data();

    public static class Data {
        @JsonInclude(Include.NON_EMPTY)
        enum ErrorCode { ERROR_INVALID_LOGIN, ERROR_USERNAME_ALREADY_TAKEN, ERROR_EMAIL_ALREADY_TAKEN };
        enum Status { ok, error };

        Status status;
        ErrorCode errorCode;
        String expiry;
        int coins;
        String email;
        String birthday;
        String pictureUrl;
        ArrayList <Performer> performer;
    }
}
}

這是我轉換它的方法:

ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

JsonOperation subscribe = new JsonOperation();

subscribe.request.requestType = "login";

subscribe.request.data.username = "Vincent";
subscribe.request.data.password = "test";


Writer strWriter = new StringWriter();
try {
    mapper.writeValue(strWriter, subscribe.request);
} catch (JsonGenerationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (JsonMappingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Log.d("JSON", strWriter.toString())

這是輸出:

{"data":{"birthday":null,"coins":null,"coinsPackage":null,"email":null,"username":"Vincent","password":"test","transactionId":null,"isLoggedIn":false},"requestType":"login"}

我怎樣才能避免那些空值? 我只想為“訂閱”目的獲取所需信息!

這正是我正在尋找的輸出:

{"data":{"username":"Vincent","password":"test"},"requestType":"login"}

我還嘗試了@JsonInclude(Include.NON_NULL) 並將我的所有變量都設置為null,但它也不起作用! 謝謝你們的幫助!

您將注釋放在錯誤的位置 - 它需要在類上,而不是在字段上。 IE:

@JsonInclude(Include.NON_NULL) //or Include.NON_EMPTY, if that fits your use case 
public static class Request {
  // ...
}

如評論中所述,在 2.x 以下的版本中,此注釋的語法為:

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) // or JsonSerialize.Inclusion.NON_EMPTY

另一種選擇是直接配置ObjectMapper ,只需調用mapper.setSerializationInclusion(Include.NON_NULL);

(作為記錄,我認為這個答案的流行表明這個注釋應該在逐個字段的基礎上適用,@fasterxml)

您還可以設置全局選項:

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

你也可以嘗試使用

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

如果您正在處理版本低於 2+ (1.9.5) 的 jackson,我對其進行了測試,您可以輕松地在類上方使用此注釋。 不為屬性指定,僅用於類聲明。

您需要添加import com.fasterxml.jackson.annotation.JsonInclude;

添加

@JsonInclude(JsonInclude.Include.NON_NULL)

在 POJO 之上

如果你有嵌套 POJO 那么

@JsonInclude(JsonInclude.Include.NON_NULL)

需要添加每個值。

注意:JAXRS (Jersey) 自動處理此場景 2.6 及更高版本。

對於傑克遜 2.x

@JsonInclude(JsonInclude.Include.NON_NULL)

就在場前。

我最近在使用 2.6.6 版時遇到了類似的問題。

@JsonInclude(JsonInclude.Include.NON_NULL)

在歸檔或類級別上使用上述注釋未按預期工作。 POJO 在我應用注釋的地方是可變的。 當我將 POJO 的行為更改為不可變時,注釋就發揮了它的魔力。

我不確定它的新版本或此庫的先前版本是否具有類似的行為,但對於 2.6.6,您當然需要擁有不可變 POJO 才能使注釋工作。

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

在 ObjectMapper 中直接在全局級別設置序列化包含的各種答案中提到的上述選項也可以工作,但我更喜歡在類或文件級別控制它。

因此,如果您希望在 JSON 序列化時忽略所有空字段,則在類級別使用注釋,但如果您只想在類中忽略少數字段,則在這些特定字段上使用它。 如果您想更改特定響應的行為,這種方式更具可讀性和易於維護。

或者您可以使用 GSON [ https://code.google.com/p/google-gson/ ],其中這些空字段將被自動刪除。

示例DTO.java

public class SampleDTO {

    String username;
    String email;
    String password;
    String birthday;
    String coinsPackage;
    String coins;
    String transactionId;
    boolean isLoggedIn;

    // getters/setters
}

測試.java

import com.google.gson.Gson;

public class Test {

    public static void main(String[] args) {
        SampleDTO objSampleDTO = new SampleDTO();
        Gson objGson = new Gson();
        System.out.println(objGson.toJson(objSampleDTO));
    }
}

輸出:

{"isLoggedIn":false}

我使用了 gson-2.2.4

如果您想從序列化中排除布爾類型,下面的代碼可能會有所幫助:

@JsonInclude(JsonInclude.Include.NON_ABSENT)

暫無
暫無

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

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