কম্পিউটার টিউটোরিয়াল

জাভাতে 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 class
class 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; // true = এরর হ্যান্ডেলড, ডিসিরিয়ালাইজেশন চালু রাখুন; false = এবর্ট
    }
}

// Customer class
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)"{...}"; line: 1, column: 65]

আরও হ্যান্ডলিং অপশন

  • @JsonIgnoreProperties(ignoreUnknown=true) ক্লাস লেভেলে - অজানা প্রপার্টি সাইলেন্টলি ইগনোর
  • objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - গ্লোবাল কনফিগ
  • DeserializationProblemHandler - কাস্টম লজিক, লগিং, ডিফল্ট ভ্যালু সেট
  1. জাভা ৯-এ জেশেলে এক্সসেপশন হ্যান্ডলিং

  2. ExclusionStrategy ইন্টারফেস ব্যবহার করে JSON সিরিয়ালাইজ/ডিসিরিয়ালাইজ

  3. জ্যাকসন অবজেক্ট মডেল দিয়ে JSON ডেটা ম্যাপিং

  4. জাভাতে JsonPointer ইন্টারফেস ব্যবহার করে কী-এর মান কীভাবে পাবেন?