簡體   English   中英

Jackson 方法中的只讀屬性

[英]Jackson read-only property in method

我需要在我的 json 中公開一個屬性,該屬性將在 getter 方法中進行處理。

class:

public class Configuracao{

   private String departamento;

   public String getDepartamento(){/**getter code**/}

   public void setDepartamento(String departamento){/**setter code**/}

   public String getDepartamentos(){/***Some logic code***/}

}

前面的 json: {departamento: "Lote", departamentos: "Lotes"}

在序列化中工作正常,但是當我的前端發布 json 回來時,jackson 會引發由“departamentos”引起的無法識別的字段異常。 我怎么知道我只想讓“departamentos”被方法值序列化並在反序列化中被忽略。 我在該方法上嘗試@JsonIgnoreProperty@JsonGetter@JsonProperty(access = JsonProperty.Access.READ_ONLY)但沒有任何效果。

只需在Configuracao class 中定義departamentos屬性即可。

public class Configuracao{
   private String departamento;
   private String departamentos;
   //omitted getter/setter
}

您可以使用JsonIgnoreProperties注釋:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.concurrent.ThreadLocalRandom;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        Configuracao c = new Configuracao();
        c.setDepartamento("D1");

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(c);
        System.out.println(json);
        System.out.println(mapper.readValue(json, Configuracao.class));
    }
}

@JsonIgnoreProperties(ignoreUnknown = true)
class Configuracao {

    private String departamento;

    public String getDepartamento() {
        return departamento;
    }

    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }

    public String getDepartamentos() {
        return departamento + " " + ThreadLocalRandom.current().nextDouble();
    }

    @Override
    public String toString() {
        return "Configuracao{" +
                "departamento='" + departamento + '\'' +
                '}';
    }
}

上面的代碼打印:

{"departamento":"D1","departamentos":"D1 0.8600092703789755"}
Configuracao{departamento='D1'}

JsonProperty.Access.READ_ONLY也應該有效:

class Configuracao {

    private String departamento;

    public String getDepartamento() {
        return departamento;
    }

    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    public String getDepartamentos() {
        return departamento + " " + ThreadLocalRandom.current().nextDouble();
    }

    @Override
    public String toString() {
        return "Configuracao{" +
                "departamento='" + departamento + '\'' +
                '}';
    }
}

上述測試按預期工作。

如果您有更多這樣的類和要忽略的字段,則可以全局禁用功能DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

一切都使用2.9.9版本進行了測試

暫無
暫無

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

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