Excepción de propiedad no reconocida en Java

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: 

  1. Deshabilitar el mapeador de objetos para deserializar en propiedades desconocidas.
  2. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *