如何处理在Java中反序列化JSON时生成的错误?

该DeserializationProblemHandler 类可以被注册时反序列化过程中遇到潜在的可恢复问题被调用。通过实现DeserializationProblemHandler 类的handleUnknownProperty()方法,我们可以处理在反序列化JSON时生成的错误。

语法

public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser p, JsonDeserializer deserializer, Object beanOrClass, String propertyName) throws IOException

示例

import java.io.*;

import com.fasterxml.jackson.core.*;

import com.fasterxml.jackson.databind.*;

import com.fasterxml.jackson.databind.deser.*;

public class DeserializationErrorTest {

   public static void main(String[] args) throws JsonMappingException, JsonGenerationException, IOException {

      String jsonString = "{\"id\":\"101\", \"name\":\"Ravi Chandra\", \"address\":\"Pune\", \"salary\":\"40000\" }";

      ObjectMapper objectMapper = new ObjectMapper();

      DeserializationProblemHandler deserializationProblemHandler = new UnMarshallingErrorHandler();

      objectMapper.addHandler(deserializationProblemHandler);

      Customer customer = objectMapper.readValue(jsonString, Customer.class);

      System.out.println(customer);

   }

}

// UnMarshallingErrorHandler classclass UnMarshallingErrorHandler extends DeserializationProblemHandler {

   @Override

   public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser jp, JsonDeserializer deserializer, Object beanOrClass, String propertyName) throws IOException, JsonProcessingException {

      boolean result = false;

      super.handleUnknownProperty(ctxt, jp, deserializer, beanOrClass, propertyName);

      System.out.println("Property with name '" + propertyName + "' doesn't exist in Class of type '" + beanOrClass.getClass().getName() + "'");

      return true; // returns true to inform the deserialization process that we can handle the error and it can continue deserializing and returns false, if we want to stop the deserialization immediately.

   }

}

//客户分类

class Customer {

   private int id;

   private String name;

   private String address;

   public int getId() {

      return id;

   }

   public void setId(int id) {

      this.id = id;

   }

   public String getName() {

      return name;

   }

   public void setName(String name) {

      this.name = name;

   }

   public String getAddress() {

      return address;

   }

   public void setAddress(String address) {

      this.address = address;

   }

   @Override

   public String toString() {

      return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]";

   }

}

返回true时输出

Property with name 'salary' doesn't exist in Class of type 'Customer'

Customer [id=101, name=Ravi Chandra, address=Pune]

返回false时的输出

Property with name 'salary' doesn't exist in Class of type 'Customer'

Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "salary" (class Customer), not marked as ignorable (3 known properties: "id", "address", "name"])

at [Source: (String)"{"id":"101", "name":"Ravi Chandra", "address":"Pune", "salary":"40000" }"; line: 1, column: 65] (through reference chain: Customer["salary"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)

at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:840)

at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1179)

at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1592) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1570) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:294)

at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)

at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202)

at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3205)

at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173)

at DeserializationErrorTest.main(DeserializationErrorTest.java:12)

以上是 如何处理在Java中反序列化JSON时生成的错误? 的全部内容, 来源链接: utcz.com/z/358336.html

回到顶部