java - true - spring boot jackson ignore unknown properties
Deserialización de Jackson Json: campo no reconocido "...", no marcado como ignorable (6)
Dado lo siguiente es tu error:
Campo no reconocido "GaugeDeviceId" (Class GaugeDevice), no marcado como ignorable
Estoy bastante seguro de que debe hacer lo mismo para la propiedad GaugeDeviceId
como lo ha hecho con la propiedad SerialNo
.
@JsonProperty("SerialNo")
public String getSerialNo() {
return this.serialNo;
}
@JsonProperty("GaugeDeviceId")
public int getGaugeDeviceId() {
return this.gaugeDeviceId;
}
Aquí tengo una clase de prueba rápida que no está lanzando errores.
import org.codehaus.jackson.map.ObjectMapper;
public class JsonDeserialization {
public static void main(final String[] args) {
final String json = "{ /"SerialNo/":/"123/", /"GaugeDeviceId/":/"456/"}";
final ObjectMapper mapper = new ObjectMapper();
try {
final GaugeDevice readValue = mapper.readValue(json, GaugeDevice.class);
System.out.println(readValue.getSerialNo());
System.out.println(readValue.getGaugeDeviceId());
} catch (final Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Y produce:
123
456
EDITAR: información de la versión
No es que importe, ya que creo que todo lo anterior está usando algo bastante estándar de jackson, estoy usando la versión 1.9.13 de las bibliotecas core-asl y mapper-asl
EDITAR: Cliente proporcionado
Me pregunto si esto está relacionado con este problema ? Creo que la resolución es la configuración de dependencias que estás usando.
No estoy seguro, pero siento que estoy cerca con la siguiente configuración de dependencia (nota que estoy usando maven)
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-processing</artifactId>
<version>2.0</version>
</dependency>
Estos enlaces han proporcionado la información de configuración: Enlace 1 , Enlace 2
Recibo el siguiente error y no encontré ninguna resolución.
Campo no reconocido "GaugeDeviceId" (Class GaugeDevice), no marcado como ignorable
El problema parece ser que el servicio devuelve los nombres de las propiedades con una letra superior, mientras que las propiedades de la clase comienzan con una letra inferior.
Lo intenté:
- cambiando los propertyNames a la primera letra superior - mismo error
- agregar
@JsonProperty("SerialNo")
a la@JsonProperty("SerialNo")
instancias de la propiedad - mismo error - agregando
@JsonProperty("SerialNo")
a los@JsonProperty("SerialNo")
correspondientes - el mismo error - agregar
@JsonProperty("SerialNo")
a los@JsonProperty("SerialNo")
correspondientes - el mismo error - agregando
@JsonProperty("SerialNo")
a todos ellos (solo por diversión) - el mismo error
(nota: @JsonProperty("SerialNo")
es solo un ejemplo)
Lo extraño es que esa anotación: @JsonIgnoreProperties(ignoreUnknown = true)
debería suprimir exactamente ese error, pero aún se está activando ...
aquí la Clase: (nota: no completa)
@JsonIgnoreProperties(ignoreUnknown = true)
public class GaugeDevice
{
private int gaugeDeviceId;
private Date utcInstallation;
private String manufacturer;
private float valueOffset;
private String serialNo;
private String comment;
private int digitCount;
private int decimalPlaces;
@JsonProperty("SerialNo")
public String getSerialNo() {
return serialNo;
}
public void setSerialNo(String serialNo) {
this.serialNo = serialNo;
}
@JsonProperty("Comment")
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
¿Dónde está la salida aquí? Por favor ayuda.
editar:
Aquí está la clase de cliente: (solo un cliente de prueba simple)
import ccc.android.meterdata.*;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import org.glassfish.jersey.jackson.JacksonFeature;
public class RestClient
{
private String connectionUrl;
private javax.ws.rs.client.Client client;
public RestClient(String baseUrl) {
client = ClientBuilder.newClient();;
connectionUrl = baseUrl;
client.register(JacksonFeature.class);
}
public GaugeDevice GetGaugeDevice(int id){
String uri = connectionUrl + "/GetGaugeDevice/" + id;
Invocation.Builder bldr = client.target(uri).request("application/json");
return bldr.get(GaugeDevice.class);
}
}
Espero que el error tenga su raíz aquí.
La solución que me funciona es la siguiente.
Agregar la importación
importar org.codehaus.jackson.map.DeserializationConfig;
Configure el ObjectMapper objectMapper.configure (DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
La solucion completa
ObjectMapper objectMapper = new ObjectMapper ();
objectMapper.configure (DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Cadena jsonInString = objectMapper.writeValueAsString (eje); Eje newElement = objectMapper.readValue (jsonInString, Eje.class); this.eje = newElement;
Otra cosa que debe ver es PropertyNamingStrategy
, que le permitiría a Jackson usar "Pascal naming" y hacer coincidir las propiedades de JSON con las propiedades de POJO. Consulte f.ex aquí: http://www.javacodegeeks.com/2013/04/how-to-use-propertynamingstrategy-in-jackson.html
Puede ignorar las propiedades desconocidas mientras deserializa utilizando una anotación a nivel de clase.
Por ejemplo :
@JsonIgnoreProperties(ignoreUnknown=true)
class Foo{
...
}
El fragmento de código anterior ignorará cualquier propiedad desconocida. (Importación de anotación: org.codehaus.jackson.annotate.JsonIgnoreProperties)
Tuve el mismo problema y lo resolví cambiando la importación de anotación de:
com.fasterxml.jackson.annotation.JsonIgnoreProperties
a
org.codehaus.jackson.annotate.JsonIgnoreProperties
No tenía que definir ninguna NamingStrategy o ObjectMapper.
Tuve el mismo problema y lo resolví cambiando la importación de anotaciones de
com.fasterxml.jackson.annotation.JsonProperty
a
org.codehaus.jackson.annotate.JsonProperty