En la aplicación de servicios web Restful, analizamos una string de solicitud JSON que luego se asigna a una clase Java. La string JSON se descompone en la clase Java mediante la biblioteca Jackson. Si la string JSON consta de propiedades que no se pueden asignar a los atributos de clase de Java, nos encontramos con UnrecognizedPropertyException . Entendamos esto con una ilustración dada a continuación.
Ilustración:
Tenemos una clase de empleado con atributos como nombre, identificación, departamento y salario. Luego creamos una string json con todas estas propiedades. Luego intentaremos deserializar la string JSON a la clase Empleado.
Al configurar Eclipse, debemos crear un proyecto Maven y agregar la siguiente dependencia en el archivo ‘pom.xml’ .
<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.2.3</version> </dependency> </dependencies>
Esto descargará los siguientes jars en nuestro proyecto.
jackson-databind-2.2.3.jar jackson-annotations-2.2.3.jar jackson-core-2.2.3.jar
Ahora avanzando, vamos a serializar y deserializar usando la biblioteca Jackson donde usamos la biblioteca Jackson para serializar el objeto del empleado en el archivo json que se crea en la carpeta src/main/resources. La biblioteca de Jackson también tiene API que prácticamente imprimen el archivo json como se implementa a continuación.
Ejemplo
Java
// Java Program to Serialize and Deserialize // Using the Jackson library // Importing input output classes // Importing Jackson classes import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.*; import java.io.File; import java.io.IOException; // Helper class class Employee { // Member variables of this class private String id; private String name; private String deptName; private double salary; // Member functions public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } } // Main class class GFG { // Main driver method public static void main(String[] args) { // creates an object mapper instance ObjectMapper mapper = new ObjectMapper(); // creates an employee instance. Employee employee = generateEmployee(); // java object to json // Try block to check for exceptions try { // Serializes the java object to json and // creates a file in src/main/resources mapper.writeValue( new File( "/home/suchitra/Desktop/suchitra/projects/java-concurrency-examples/json-parsing/src/main/resources/emp.json"), employee); // Creating a json string String empJson = mapper.writeValueAsString(employee); // Print and display System.out.println(empJson); // Pretty print String empJsonPrettyPrint = mapper.writerWithDefaultPrettyPrinter() .writeValueAsString(employee); System.out.println("Pretty print format"); System.out.println(empJsonPrettyPrint); } // Catch block 2 // Catch block to handle exceptions // related to json generation catch (JsonGenerationException e) { // Print the exception along with line number // using printStackTrace() method e.printStackTrace(); } // Catch block 2 // Catch block to handle exceptions // related to json mapping catch (JsonMappingException e) { e.printStackTrace(); } // Catch block 3 // Catch block to handle basic exceptions catch (IOException e) { e.printStackTrace(); } // Convert to a json string } private static Employee generateEmployee() { Employee employee = new Employee(); employee.setId("e01010"); employee.setName("Jane"); employee.setDeptName("Sales"); employee.setSalary(100000.00); return employee; } }
Producción:
{"id":"e01010","name":"Jane","deptName":"Sales","salary":100000.0} Pretty print format { "id" : "e01010", "name" : "Jane", "deptName" : "Sales", "salary" : 100000.0 }
El archivo emp.json se crea en la carpeta src/main/resources.
{"id":"e01010","name":"Jane","deptName":"Sales","salary":100000.0}
Ahora entendamos UnrecognizedPropertyException a través de un ejemplo cuando obtenemos esta excepción al analizar archivos json.
Implementación:
- Creamos un archivo json con una nueva propiedad agregada como phoneNumber. Sin embargo, esta propiedad no está presente en la clase Empleado.
- Cuando la biblioteca Jackson intenta desarmar/deserializar los valores del campo json a los atributos de la clase, no puede reconocer esta propiedad y genera la excepción UnrecognizedPropertyException.
- Creamos un archivo emp1.json en src/main/resources. El archivo emp1.json tiene una nueva propiedad phoneNumber que no forma parte de la clase Employee.
{"id":"e01010","name":"Jane","deptName":"Sales","salary":100000.0,"phoneNumber": 98218281812}
Ejemplo
Java
// Java Program to Illustrate UnrecognizedPropertyException // While parsing json files // Importing input output classes import java.io.*; // Class 1 // Helper class class Employee { // Member variables of this class private String id; private String name; private String deptName; private double salary; // Member functions of this class public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", deptName=" + deptName + ", salary=" + salary + "]"; } } // Class 2 // Main class class GFG { // Main driver method public static void main(String[] args) { // Creating an object of ObjectMapper class ObjectMapper mapper = new ObjectMapper(); // Try block to check for exceptions try { // mapper reads from json file and deserializes // it to Employee object Employee emp = mapper.readValue( new File( "/home/suchitra/Desktop/suchitra/projects/java-concurrency-examples/json-parsing/src/main/resources/emp1.json"), Employee.class); System.out.println( "Reading values of employee attributes from a json file"); System.out.println(emp.toString()); } // Catch Block 1 // Handling json parsing exception catch (JsonParseException e) { // Print and display the exception along with // line number using printStackTrace() method e.printStackTrace(); } // Catch Block 2 // Handling json mapping exception catch (JsonMappingException e) { e.printStackTrace(); } // Catch Block 3 // Catch block to handle basic exceptions catch (IOException e) { e.printStackTrace(); } } }
Producción:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "phoneNumber" (class com.sample.json.Employee), not marked as ignorable (4 known properties: , "deptName", "salary", "id", "name"]) at [Source: /home/suchitra/Desktop/suchitra/projects/java-concurrency-examples/json-parsing/src/main/resources/emp1.json; line: 1, column: 93] (through reference chain: com.sample.json.Employee["phoneNumber"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:79) at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:555) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:708) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1160) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:315) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1988) at com.sample.json.TestParsingException.main(TestParsingException.java:19)
Nota: La excepción indica que no puede reconocer la propiedad phoneNumber que forma parte del archivo emp1.json. Esto se debe a que no puede asignar esta propiedad a los atributos de la clase Empleado.
Ahora analicemos una salida para deshacernos de esta excepción. A continuación se presentan dos formas con las que podemos incorporarnos para el mismo las cuales son las siguientes:
- Deshabilitar el mapeador de objetos para deserializar en propiedades desconocidas.
- Proporcionar una anotación en el nivel de clase @JsonIgnoreProperties.
Método 1: deshabilitar el mapeador de objetos para deserializar en propiedades desconocidas.
Para resolver este problema, deshabilitamos el mapeador de objetos para deserializar propiedades desconocidas. Por lo tanto, el mapeador de objetos desarmará/deserializará solo aquellas propiedades del archivo json que están asignadas a la clase java. Tenemos emp1.json que es similar al ejemplo anterior.
emp1.json {"id":"e01010","name":"Jane","deptName":"Sales","salary":100000.0,"phoneNumber": 98218281812}
Ejemplo
Java
// Java Program to Remove UnrecognizedPropertyException by // Disabling the object mapper to deserialize on unknown // properties. package com.sample.json; // Importing input output classes import java.io.*; // Class 1 // Helper class public class Employee { // Member variables of this class private String id; private String name; private String deptName; private double salary; // Member methods of this class public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", deptName=" + deptName + ", salary=" + salary + "]"; } } // Class 2 // Main class class GFG { // Main driver method public static void main(String[] args) { // Creating an object of ObjectMapper class ObjectMapper mapper = new ObjectMapper(); // Try block to check for exceptions try { // Disabling the mapper object to deserialize // properties which cannot be mapped to java // class mapper.disable(DeserializationFeature .FAIL_ON_UNKNOWN_PROPERTIES); // mapper reading the json file and // deserializes it to employee object Employee emp = mapper.readValue( new File( "/home/suchitra/Desktop/suchitra/projects/java-concurrency-examples/json-parsing/src/main/resources/emp1.json"), Employee.class); // Display message only System.out.println( "Reading values of employee attributes from a json file"); // Print and display System.out.println(emp.toString()); } // Catch block to handle exceptions // Catch block 1 to deal with json parsing exception catch (JsonParseException e) { e.printStackTrace(); } // Catch block 2 to deal with json mapping exception catch (JsonMappingException e) { e.printStackTrace(); } // Catch block 2 to deal with basic I/O exceptions catch (IOException e) { e.printStackTrace(); } } }
Producción:
Reading values of employee attributes from a json file Employee [id=e01010, name=Jane, deptName=Sales, salary=100000.0]
Método 2: proporcionar una anotación en el nivel de clase @JsonIgnoreProperties
Otro enfoque es proporcionar una anotación en el nivel de clase @JsonIgnoreProperties(ignoreUnknown = true). Esta anotación le dice a Jackson que ignore aquellos atributos que no se pueden asignar a la clase Java. Este es el mismo emp1.json del ejemplo anterior.
emp1.json {"id":"e01010","name":"Jane","deptName":"Sales","salary":100000.0,"phoneNumber": 98218281812}
Ejemplo
Java
// Java Program to Remove UnrecognizedPropertyException by // Providing an annotation at the class level // @JsonIgnoreProperties // Importing required classes import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import java.io.*; @JsonIgnoreProperties(ignoreUnknown = true) // Class 1 // Helper class public class Employee { // Member variables of this class private String id; private String name; private String deptName; private double salary; // Mamber functions of this class public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } @Override public String toString() { return "Employee [id=" + id + ", name=" + name + ", deptName=" + deptName + ", salary=" + salary + "]"; } } // Class 2 // Main class class GFG { // Main driver method public static void main(String[] args) { // Creating an object of ObjectMapper class ObjectMapper mapper = new ObjectMapper(); // Try block to check for exceptions try { // Mapper reads from emp1.json and deserializes // it to employee object. It ignores those // properties which are not mapped to java class Employee emp = mapper.readValue( new File( "/home/suchitra/Desktop/suchitra/projects/java-concurrency-examples/json-parsing/src/main/resources/emp1.json"), Employee.class); System.out.println( "Reading values of employee attributes from a json file"); System.out.println(emp.toString()); } // Catch block to handle the exceptions // Catch Block 1 catch (JsonParseException e) { // Print the exception along with line number // using printStackTrace() method e.printStackTrace(); } // Catch Block 2 catch (JsonMappingException e) { e.printStackTrace(); } // Catch Block 3 // Handling basic I/O exceptions catch (IOException e) { e.printStackTrace(); } } }
Producción:
Reading values of employee attributes from a json file Employee [id=e01010, name=Jane, deptName=Sales, salary=100000.0]
Publicación traducida automáticamente
Artículo escrito por suchitrasrinivas y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA