【问题标题】:Ignore absent property when mapping json response映射 json 响应时忽略不存在的属性
【发布时间】:2016-08-23 10:32:02
【问题描述】:

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

  1. 用户仅使用“姓氏”开始研究
  2. 用户使用姓和名开始研究

在第一种情况下,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 客户:

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 进入完全恐慌模式...

【问题讨论】:

  • 能否请您也发布一个您尝试解析的数据示例?
  • 尝试将注释更改为:@JsonInclude(Include.NON_NULL)@JsonInclude(JsonSerialize.Inclusion.NON_NULL)
  • 这些注解给了我同样的错误:“Include/JsonSerialize cannot be resolve to a variable”

标签: java json spring jackson pojo


【解决方案1】:

您需要将对象映射器配置为不会在空 bean 上失败。

这是一个示例代码,因为您没有自己提供 ObjectMapper 代码的创建:

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

【讨论】:

  • jacksonMapper.configure(DeSerializationFeature.FAIL_ON_UNKNOWN_PROPERTY, false) 怎么样;
  • 我没有创建 ObjectMapper
  • 那么如何使用Jackson进行序列化和反序列化呢?
  • RequestEntity request = new RequestEntity(HttpMethod.GET, new URI(url)); ResponseEntity response = restTemplate.exchange(request, new ParameterizedTypeReference(){}); Cliente[] clienti = response.getBody();
  • 你使用什么框架来包装你的杰克逊使用?
【解决方案2】:

你也可以使用:

jacksonMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES,false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2017-02-19
    • 2022-11-21
    • 1970-01-01
    • 2017-12-31
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多