java - not - Jackson con JSON: campo no reconocido, no marcado como ignorable
@jsonignoreproperties (30)
Anote los estudiantes de campo como se muestra a continuación, ya que no hay coincidencia en los nombres de propiedad json y propiedad java
public Class Wrapper {
@JsonProperty("wrapper")
private List<Student> students;
//getters & setters here
}
Necesito convertir una determinada cadena JSON en un objeto Java. Estoy usando Jackson para el manejo de JSON. No tengo control sobre la entrada JSON (leo desde un servicio web). Esta es mi entrada JSON:
{"wrapper":[{"id":"13","name":"Fred"}]}
Aquí hay un caso de uso simplificado:
private void tryReading() {
String jsonStr = "{/"wrapper/"/:[{/"id/":/"13/",/"name/":/"Fred/"}]}";
ObjectMapper mapper = new ObjectMapper();
Wrapper wrapper = null;
try {
wrapper = mapper.readValue(jsonStr , Wrapper.class);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("wrapper = " + wrapper);
}
Mi clase de entidad es:
public Class Student {
private String name;
private String id;
//getters & setters for name & id here
}
Mi clase de Wrapper es básicamente un objeto contenedor para obtener mi lista de estudiantes:
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
Sigo recibiendo este error y "wrapper" devuelve null
. No estoy seguro de lo que falta. ¿Puede alguien ayudar, por favor?
org.codehaus.jackson.map.exc.UnrecognizedPropertyException:
Unrecognized field "wrapper" (Class Wrapper), not marked as ignorable
at [Source: java.io.StringReader@1198891; line: 1, column: 13]
(through reference chain: Wrapper["wrapper"])
at org.codehaus.jackson.map.exc.UnrecognizedPropertyException
.from(UnrecognizedPropertyException.java:53)
Como nadie más ha mencionado, pensé que lo haría ...
El problema es que su propiedad en su JSON se llama "envoltorio" y su propiedad en Wrapper.class se llama "estudiantes".
Así que, o bien ...
- Corrija el nombre de la propiedad en la clase o en JSON.
- Anota tu variable de propiedad según el comentario de StaxMan.
- Anota el setter (si tienes uno)
Cualquiera de los dos cambios
public Class Wrapper {
private List<Student> students;
//getters & setters here
}
a
public Class Wrapper {
private List<Student> wrapper;
//getters & setters here
}
---- o ----
Cambia tu cadena JSON a
{"students":[{"id":"13","name":"Fred"}]}
El POJO debe definirse como
Clase de respuesta
public class Response {
private List<Wrapper> wrappers;
// getter and setter
}
Clase de envoltura
public class Wrapper {
private String id;
private String name;
// getters and setters
}
y mapeador para leer valor
Response response = mapper.readValue(jsonStr , Response.class);
En mi caso el error se debió a la siguiente razón.
Inicialmente funcionaba bien, luego cambié el nombre de una variable, hice los cambios en el código y me dio este error.
Entonces apliqué la propiedad de Jackson ignorant también pero no funcionó.
Finalmente, después de volver a definir mis métodos de obtención y configuración según el nombre de mi variable, se resolvió este error.
Así que asegúrate de redifinar los captadores y setters también.
En mi caso, fue simple: el objeto JSON del servicio REST se actualizó (se agregó una propiedad), pero el objeto JSON del cliente REST no lo fue. Tan pronto como actualicé el objeto cliente JSON, la excepción ''Campo no reconocido ...'' se desvaneció.
Esta puede ser una respuesta muy tardía, pero solo cambiando el POJO a esto debería resolver la cadena json proporcionada en el problema (ya que, la cadena de entrada no está bajo su control como dijo):
public class Wrapper {
private List<Student> wrapper;
//getters & setters here
}
Esta solución es genérica al leer las transmisiones json y necesita obtener solo algunos campos, mientras que los campos que no se asignaron correctamente en sus clases de dominio se pueden ignorar:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
Una solución detallada sería utilizar una herramienta como jsonschema2pojo para generar automáticamente las clases de dominio requeridas, como Student, del esquema de la respuesta json. Usted puede hacer esto último por cualquier json en línea al convertidor de esquema.
Establece públicos tus campos de clase no privados .
public Class Student {
public String name;
public String id;
//getters & setters for name & id here
}
Esto funcionó perfectamente para mí
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(
DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
@JsonIgnoreProperties(ignoreUnknown = true)
no lo hizo.
Esto funcionó perfectamente para mí
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Esto funciona mejor que Todos por favor refiérase a esta propiedad.
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
projectVO = objectMapper.readValue(yourjsonstring, Test.class);
Google me trajo aquí y me sorprendió ver las respuestas ... todas sugeridas para evitar el error ( que siempre reduce 4 veces más en el desarrollo ) en lugar de resolverlo hasta que este señor restaurado por fe en SO!
objectMapper.readValue(responseBody, TargetClass.class)
se utiliza para convertir una cadena json en un objeto de clase, lo que falta es que TargetClass
debe tener TargetClass
públicos de get
/ set
. ¡Lo mismo falta en el fragmento de la pregunta de OP también! :)
via lombok tu clase como abajo deberia funcionar !!
@Data
@Builder
public class TargetClass {
private String a;
}
He intentado el siguiente método y funciona para esa lectura de formato JSON con Jackson. Utilice la solución ya sugerida de: anotar getter con @JsonProperty("wrapper")
Tu clase de envoltura
public Class Wrapper{
private List<Student> students;
//getters & setters here
}
Mi sugerencia de la clase de envoltura
public Class Wrapper{
private StudentHelper students;
//getters & setters here
// Annotate getter
@JsonProperty("wrapper")
StudentHelper getStudents() {
return students;
}
}
public class StudentHelper {
@JsonProperty("Student")
public List<Student> students;
//CTOR, getters and setters
//NOTE: If students is private annotate getter with the annotation @JsonProperty("Student")
}
Sin embargo, esto le daría la salida del formato:
{"wrapper":{"student":[{"id":13,"name":Fred}]}}
También para obtener más información, consulte https://github.com/FasterXML/jackson-annotations
Espero que esto ayude
Jackson se queja porque no puede encontrar un campo en su clase Wrapper que se llame "wrapper". Está haciendo esto porque su objeto JSON tiene una propiedad llamada "contenedor".
Creo que la solución es cambiar el nombre del campo de tu clase de Envoltorio a "envoltorio" en lugar de "estudiantes".
La primera respuesta es casi correcta, pero lo que se necesita es cambiar el método de obtención, NO campo: el campo es privado (y no se detecta automáticamente); Además, los captadores tienen prioridad sobre los campos si ambos están visibles. (Hay formas de hacer visibles los campos privados también, pero si quieres tener captador no tiene mucho sentido)
Por lo tanto, getter debe ser nombrado getWrapper()
, o anotado con:
@JsonProperty("wrapper")
Si prefieres el nombre del método getter como es.
Lo que funcionó para mí, fue hacer pública la propiedad. Me solucionó el problema.
Me funcionó con el siguiente código:
ObjectMapper mapper =new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Por mi parte, la única línea.
@JsonIgnoreProperties(ignoreUnknown = true)
no funcionó demasiado
Solo agrega
@JsonInclude(Include.NON_EMPTY)
Jackson 2.4.0
Puedes usar
ObjectMapper objectMapper = getObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Ignorará todas las propiedades que no estén declaradas.
Puedes usar la anotación de nivel de clase de Jackson:
@JsonIgnoreProperties
Ignorará todas las propiedades que no haya definido en su POJO. Muy útil cuando solo busca un par de propiedades en el JSON y no desea escribir la asignación completa. Más información en el sitio web de Jackson . Si desea ignorar cualquier propiedad no declarada, debe escribir:
@JsonIgnoreProperties(ignoreUnknown = true)
Se puede lograr de 2 maneras:
Marque el POJO para ignorar propiedades desconocidas
@JsonIgnoreProperties(ignoreUnknown = true)
Configure ObjectMapper que serializa / des-serializa el POJO / json de la siguiente manera:
ObjectMapper mapper =new ObjectMapper(); // for Jackson version 1.X mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); // for Jackson version 2.X mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
Según el doc , puede ignorar los campos seleccionados o todos los campos desconocidos:
// to prevent specified fields from being serialized or deserialized
// (i.e. not include in JSON output; or being set even if they were included)
@JsonIgnoreProperties({ "internalId", "secretKey" })
// To ignore any unknown properties in JSON input without exception:
@JsonIgnoreProperties(ignoreUnknown=true)
Si está utilizando Jackson 2.0
ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Solo debes cambiar el campo de la Lista de "estudiantes" a "envoltorio", solo el archivo json y el asignador lo buscará.
Solucioné este problema simplemente cambiando las firmas de mis métodos de establecimiento y obtención de mi clase POJO. Todo lo que tenía que hacer era cambiar el método getObject para que coincidiera con lo que el mapeador estaba buscando. En mi caso, originalmente tenía un getImageUrl , pero los datos JSON tenían image_url que estaba descartando al mapeador. Cambié tanto mi setter como mis getters a getImage_url y setImage_url .
Espero que esto ayude.
Su cadena json no está en línea con la clase asignada. Cambiar la cadena de entrada
String jsonStr = "{/"students/"/:[{/"id/":/"13/",/"name/":/"Fred/"}]}";
O cambia tu clase asignada
public class Wrapper {
private List<Student> wrapper;
//getters & setters here
}
Tu aportación
{"wrapper":[{"id":"13","name":"Fred"}]}
indica que es un Objeto, con un campo llamado "contenedor", que es una Colección de Estudiantes. Así que mi recomendación sería,
Wrapper = mapper.readValue(jsonStr , Wrapper.class);
donde Wrapper
se define como
class Wrapper {
List<Student> wrapper;
}
Usando Jackson 2.6.0, esto funcionó para mí:
private static final ObjectMapper objectMapper =
new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
y con el ajuste:
@JsonIgnoreProperties(ignoreUnknown = true)
El nuevo Android Firebase introdujo algunos cambios enormes; debajo de la copia del documento:
[ https://firebase.google.com/support/guides/firebase-android] :
Actualice sus objetos modelo de Java
Al igual que con el SDK 2.x, Firebase Database convertirá automáticamente los objetos Java que pase a DatabaseReference.setValue()
en JSON y podrá leer JSON en objetos Java utilizando DataSnapshot.getValue()
.
En el nuevo SDK, al leer JSON en un objeto Java con DataSnapshot.getValue()
, las propiedades desconocidas en el JSON ahora se ignoran de manera predeterminada, por lo que ya no necesita @JsonIgnoreExtraProperties(ignoreUnknown=true)
.
Para excluir campos / getters al escribir un objeto Java en JSON, la anotación ahora se llama @Exclude
lugar de @JsonIgnore
.
BEFORE
@JsonIgnoreExtraProperties(ignoreUnknown=true)
public class ChatMessage {
public String name;
public String message;
@JsonIgnore
public String ignoreThisField;
}
dataSnapshot.getValue(ChatMessage.class)
AFTER
public class ChatMessage {
public String name;
public String message;
@Exclude
public String ignoreThisField;
}
dataSnapshot.getValue(ChatMessage.class)
Si hay una propiedad adicional en su JSON que no está en su clase de Java, verá esta advertencia en los archivos de registro:
W/ClassMapper: No setter/field for ignoreThisProperty found on class com.firebase.migrationguide.ChatMessage
Puede deshacerse de esta advertencia colocando una anotación @IgnoreExtraProperties
en su clase. Si desea que la base de datos Firebase se comporte como lo hizo en el SDK 2.x y arroje una excepción si hay propiedades desconocidas, puede poner una anotación @ThrowOnExtraProperties
en su clase.