Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีจัดการกับข้อผิดพลาดที่สร้างขึ้นขณะทำการดีซีเรียลไลซ์ JSON ใน Java


ตัวจัดการปัญหา DeserializationProblemHandler สามารถลงทะเบียนคลาสเพื่อรับการเรียกเมื่อพบปัญหาที่อาจกู้คืนได้ในระหว่างกระบวนการดีซีเรียลไลเซชัน เราสามารถจัดการกับข้อผิดพลาดที่สร้างขึ้นในขณะที่ดีซีเรียลไลซ์ JSON ได้โดยใช้ handleUnknownProperty() วิธีการของ ดีซีเรียลไลเซชันProblemHandler ชั้นเรียน

ไวยากรณ์

ตัวจัดการบูลีนสาธารณะUnknownProperty (DeserializationContext ctxt, JsonParser p, JsonDeserializer deserializer, Object beanOrClass, String propertyName) พ่น IOException

ตัวอย่าง

<ก่อนหน้า>นำเข้า java.io.*;นำเข้า com.fasterxml.jackson.core.*;นำเข้า com.fasterxml.jackson.databind.*;นำเข้า com.fasterxml.jackson.databind.deser.*;คลาสสาธารณะ DeserializationErrorTest { สาธารณะ static void main (String[] args) พ่น JsonMappingException, JsonGenerationException, IOException { String jsonString ="{\"id\":\"101\", \"name\":\"Ravi Chandra\", \"address\ ":\"ปูเน่\", \"เงินเดือน\":\"40000\" }"; ObjectMapper objectMapper =ใหม่ ObjectMapper (); DeserializationProblemHandler deserializationProblemHandler =UnMarshallingErrorHandler ใหม่ (); objectMapper.addHandler (ดีซีเรียลไลเซชั่นProblemHandler); ลูกค้าลูกค้า =objectMapper.readValue(jsonString, Customer.class); System.out.println(ลูกค้า); }}// UnMarshallingErrorHandler คลาส คลาส UnMarshallingErrorHandler ขยาย DeserializationProblemHandler { @Override ตัวจัดการบูลีนสาธารณะUnknownProperty (DeserializationContext ctxt, JsonParser jp, JsonDeserializer deserializer, Object beanOrClass, String propertyName) พ่น IOException, JsonProcessingException { ผลลัพธ์บูลีน =false; super.handleUnknownProperty (ctxt, jp, deserializer, beanOrClass, propertyName); System.out.println("คุณสมบัติที่มีชื่อ '" + propertyName + "' ไม่มีอยู่ในคลาสของประเภท '" + beanOrClass.getClass().getName() + "'"); คืนค่าจริง; // คืนค่า true เพื่อแจ้งกระบวนการดีซีเรียลไลเซชันว่าเราสามารถจัดการกับข้อผิดพลาดได้ และสามารถทำการดีซีเรียลไลซ์ต่อไปและคืนค่าเท็จได้ หากเราต้องการหยุดการดีซีเรียลไลเซชันทันที }} // ลูกค้า classclass ลูกค้า { รหัส int ส่วนตัว; ชื่อสตริงส่วนตัว ที่อยู่สตริงส่วนตัว int สาธารณะ getId () { รหัสส่งคืน; } โมฆะสาธารณะ setId (int id) { this.id =id; } สตริงสาธารณะ getName() { ชื่อกลับ; } โมฆะสาธารณะ setName (ชื่อสตริง) { this.name =ชื่อ; } สตริงสาธารณะ getAddress() { ที่อยู่ผู้ส่งกลับ; } โมฆะสาธารณะ setAddress (ที่อยู่สตริง) { this.address =ที่อยู่; } @แทนที่สตริงสาธารณะ toString () { ส่งคืน "ลูกค้า [id=" + id + ", name=" + ชื่อ + ", address=" + ที่อยู่ + "]"; }}

ผลลัพธ์เมื่อคืนค่า true

ทรัพย์สินที่มีชื่อ 'เงินเดือน' ไม่มีอยู่ในประเภทประเภท 'ลูกค้า' ลูกค้า [id=101, name=Ravi Chandra, address=Pune]

ผลลัพธ์เมื่อคืนค่าเท็จ

คุณสมบัติที่มีชื่อ 'เงินเดือน' ไม่มีอยู่ในคลาสประเภท 'Customer'Exception ในเธรด "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:ฟิลด์ที่ไม่รู้จัก "เงินเดือน" (คลาสลูกค้า) ไม่ได้ทำเครื่องหมาย เป็นที่เพิกเฉย (คุณสมบัติที่รู้จัก 3 รายการ:"id", "address", "name"])at [Source:(String)"{"id":"101", "name":"Ravi Chandra", "address":"ปูเน่", "เงินเดือน":40000" }"; บรรทัด:1 คอลัมน์:65] (ผ่านสายอ้างอิง:ลูกค้า ["เงินเดือน"]) ที่ com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from (UnrecognizedPropertyException.java:61) ที่ com.fasterxml.jackson.databind DeserializationContext.handleUnknownProperty (DeserializationContext.java:840) ที่ com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty (StdDeserializer.java:1179) ที่ com.fasterxml.jackson.databind.Deserializer.Property java:1592) ที่ com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1570) ที่ com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializerBase.java:1570) เร็ว:เร็ว .jackson.databind.deser.BeanDeserializer.deserialize (BeanDeserializer.java:151) ที่ com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose (ObjectMapper.java:4202) ที่ com.fasterxml.jackson.databind.ObjectMapper.readVal .java:3205)ที่ com.fas terxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3173) ที่ DeserializationErrorTest.main (DeserializationErrorTest.java:12)