Jackson লাইব্রেরি JSON serialization এবং deserialization-এর ক্ষেত্রে Optional Properties এবং Default Values সেট করার জন্য সহজ এবং কার্যকর পদ্ধতি সরবরাহ করে। এটি ডাইনামিক এবং কাঠামোবিহীন JSON হ্যান্ডল করতে সাহায্য করে। নিচে এই বিষয়গুলোর বিস্তারিত ব্যাখ্যা করা হলো।
1. Optional Properties হ্যান্ডল করা
1.1 @JsonIgnoreProperties
- JSON-এ থাকা অপ্রয়োজনীয় বা অতিরিক্ত প্রপার্টি হ্যান্ডল করতে ব্যবহার করা হয়।
- অজানা প্রপার্টিগুলোকে উপেক্ষা করতে
ignoreUnknown = trueব্যবহার করা হয়।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
private String name;
private int age;
// Getters and Setters
}
JSON ইনপুট:
{
"name": "Alice",
"age": 25,
"unknownProperty": "value"
}
আউটপুট:
Deserialized User: User{name='Alice', age=25}
1.2 Optional ফিল্ডের জন্য Default Values সেট করা
@JsonSetter এবং @JsonProperty
উদাহরণ ১: Default Values সহ Optional Properties
import com.fasterxml.jackson.annotation.JsonProperty;
public class User {
private String name;
@JsonProperty(defaultValue = "18")
private int age;
// Getters and Setters
}
JSON ইনপুট (age অনুপস্থিত):
{
"name": "Alice"
}
আউটপুট:
Deserialized User: User{name='Alice', age=18}
1.3 Null বা অনুপস্থিত প্রপার্টি হ্যান্ডল করা
@JsonInclude: Optional Properties বাদ দেওয়া
@JsonInclude ব্যবহার করে null বা অনুপস্থিত প্রপার্টিগুলো serialization-এর সময় বাদ দেওয়া যায়।
import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
private String name;
private String email;
// Getters and Setters
}
JSON আউটপুট (email=null):
{
"name": "Alice"
}
2. Default Values সেট করার পদ্ধতি
2.1 Constructor-based Default Values
Constructor ব্যবহার করে Optional Properties-এর জন্য Default Value সেট করা যায়।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class User {
private String name;
private int age;
@JsonCreator
public User(@JsonProperty("name") String name, @JsonProperty("age") Integer age) {
this.name = name;
this.age = (age != null) ? age : 18; // Default Value
}
// Getters and Setters
}
JSON ইনপুট (age অনুপস্থিত):
{
"name": "Alice"
}
আউটপুট:
Deserialized User: User{name='Alice', age=18}
2.2 Optional এবং Default Value Handling with @JsonSetter
@JsonSetter দিয়ে Null প্রপার্টির জন্য Default Value সেট করা যায়।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonSetter;
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JsonSetter
public void setAge(Integer age) {
this.age = (age != null) ? age : 18; // Default Value
}
public int getAge() {
return age;
}
}
JSON ইনপুট:
{
"name": "Alice"
}
আউটপুট:
Deserialized User: User{name='Alice', age=18}
2.3 Default Values with @JsonDeserialize
Custom Deserializer ব্যবহার করে Default Values সেট করা সম্ভব।
উদাহরণ:
import com.fasterxml.jackson.annotation.JsonDeserialize;
@JsonDeserialize(using = UserDeserializer.class)
public class User {
private String name;
private int age;
// Getters and Setters
}
Custom Deserializer:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
public class UserDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonNode node = p.getCodec().readTree(p);
String name = node.get("name").asText();
int age = node.has("age") ? node.get("age").asInt() : 18; // Default Value
return new User(name, age);
}
}
3. Optional Properties এবং Default Values Handling-এর Industry Standards
3.1 Avoid Hardcoding Defaults
- Optional Properties-এর জন্য ডিফল্ট ভ্যালু সরাসরি Constructor বা Setter-এ রাখুন।
3.2 Use Annotations for Simple Cases
@JsonProperty(defaultValue)এবং@JsonSetterছোট প্রোজেক্টে ব্যবহার করুন।- জটিল লজিকের জন্য Custom Deserializer ব্যবহার করুন।
3.3 Include Only Necessary Fields
@JsonIncludeদিয়ে serialization-এর সময় null বা optional ফিল্ড বাদ দিন।
3.4 Handle Unknown Fields Gracefully
@JsonIgnoreProperties(ignoreUnknown = true)ব্যবহার করে অজানা প্রপার্টি হ্যান্ডল করুন।
3.5 Consistent JSON API Design
- API ডেভেলপমেন্টে Optional Properties এবং Default Values ক্লিয়ারলি ডকুমেন্ট করুন।
4. উদাহরণ: Full Implementation
User Class:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
@JsonProperty(defaultValue = "Guest")
private String name;
@JsonProperty(defaultValue = "18")
private int age;
// Getters and Setters
}
Serialization এবং Deserialization:
import com.fasterxml.jackson.databind.ObjectMapper;
public class DefaultValuesExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Deserialize JSON
String json = "{\"name\":\"Alice\"}";
User user = mapper.readValue(json, User.class);
System.out.println("Deserialized User: " + user.getName() + ", Age: " + user.getAge());
// Serialize Object
String serializedJson = mapper.writeValueAsString(user);
System.out.println("Serialized JSON: " + serializedJson);
}
}
আউটপুট:
Deserialized User: Alice, Age: 18
Serialized JSON: {"name":"Alice","age":18}
Jackson-এ Optional Properties এবং Default Values সেট করার জন্য বিভিন্ন পদ্ধতি রয়েছে। @JsonProperty(defaultValue) এবং @JsonSetter ছোট এবং সহজ সমাধান প্রদান করে। বড় এবং জটিল প্রোজেক্টের ক্ষেত্রে Custom Deserializer ব্যবহার করে আরও ভালো কন্ট্রোল পাওয়া যায়। Industry Standards মেনে কাজ করলে কোড আরও রিডেবল, মেনটেইনেবল, এবং পারফরম্যান্ট হবে।
Read more