映射json响应时忽略不存在的属性

时间:2016-08-23 10:32:03

标签: java json spring jackson pojo

我有一张应该返回客户列表的表单。
在两种情况下,此表单的行为应该不同:

  1. 用户仅使用"姓氏"
  2. 开始研究
  3. 用户使用姓氏和名称开始研究

  4. 在第一种情况下,json响应的字段少于第二种情况下的响应,因此我必须忽略所有这些字段。
    我已尝试使用@JsonInclude(JsonInclude.Include.NON_ABSENT)@JsonInclude(JsonInclude.Include.NON_EMPTY)@JsonInclude(JsonInclude.Include.NON_NULL),但每次返回的错误始终相同:

    java.lang.Exception: Could not write content: (was java.lang.NullPointerException) (through reference chain: it.gruppoitas.itasacquire.pojo.Cliente["DATA_NASCITA"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: it.gruppoitas.itasacquire.pojo.Cliente["DATA_NASCITA"])
    



    这是pojo Cliente:

    package it.gruppoitas.itasacquire.pojo;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    
    @JsonInclude(JsonInclude.Include.NON_ABSENT)
    public class Cliente {
    
    @JsonProperty("TIPO_PERSONA")
    private String tipoPersona;
    @JsonProperty("PRO_CLIE")
    private String proClie;
    @JsonProperty("CODICE_FISCALE")
    private String codiceFiscale;
    @JsonProperty("DATA_NASCITA")
    private String dataNascita;
    @JsonProperty("SESSO")
    private String sesso;
    @JsonProperty("NOME")
    private String nome;
    @JsonProperty("COGNOME")
    private String cognome;
    
    public String getTipoPersona() {
        return tipoPersona;
    }
    
    public void setTipoPersona(String tipoPersona) {
        this.tipoPersona = tipoPersona;
    }
    
    public String getProClie() {
        return proClie;
    }
    
    public void setProClie(String proClie) {
        this.proClie = proClie;
    }
    
    public String getCodiceFiscale() {
        return codiceFiscale;
    }
    
    public void setCodiceFiscale(String codiceFiscale) {
        this.codiceFiscale = codiceFiscale;
    }
    
    public String getDataNascita() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
        Date data = null;
        try {
            data = sdf.parse(dataNascita);
            dataNascita = new SimpleDateFormat("dd/MM/yyyy").format(data);
        } catch (ParseException e) {
            System.err.println(e);
        }
        return dataNascita;
    }
    
    public void setDataNascita(String dataNascita) {
        this.dataNascita = dataNascita;
    }
    
    public String getSesso() {
        return sesso;
    }
    
    public void setSesso(String sesso) {
        this.sesso = sesso;
    }
    
    public String getNome() {
        return nome;
    }
    
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    public String getCognome() {
        return cognome;
    }
    
    public void setCognome(String cognome) {
        this.cognome = cognome;
    }
    
    @Override
    public String toString() {
        return "Cliente [tipoPersona=" + tipoPersona + ", proClie=" + proClie + ", codiceFiscale=" + codiceFiscale + ", dataNascita="
                + dataNascita + ", sesso=" + sesso + ", nome=" + nome + ", cognome=" + cognome + "]";
    }}
    



    任何的想法?

    编辑:这是案例1中的json响应结构的一个例子

     {
      "TIPO_PERSONA" : "G",
      "PRO_CLIE" : "123456789",
      "CODICE_FISCALE" : "123456789",
      "PARTITA_IVA" : "123456789",
      "SESSO" : "S",
      "COGNOME" : "CUSTOMER SRL"
    }
    


    这是案例2中的json响应的一个例子:

         {  
          "TIPO_PERSONA" : "F",
          "PRO_CLIE" : "123456789",
          "CODICE_FISCALE" : "123456789",
          "DATA_NASCITA" : "1969-09-07 00:00:00.0",
          "SESSO" : "F",
          "NOME" : "Foo",
          "COGNOME" : "Fie"
        }
    


    正如您所看到的,案例1中的字段较少,STS处于完全恐慌模式...

2 个答案:

答案 0 :(得分:1)

您需要配置对象映射器,以免空豆失败。

以下是一个示例代码,因为您没有自己创建ObjectMapper代码:

private ObjectMapper jacksonMapper = new ObjectMapper();
jacksonMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
jacksonMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

答案 1 :(得分:0)

您还可以使用:

jacksonMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES,false);