Properties এর নাম পরিবর্তন করা (serialization এবং deserialization)

@JsonProperty Annotation - জ্যাকসন অ্যানোটেশন (Jackson Annotations) - Java Technologies

302

Jackson JSON সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করার সময় Java Object এর properties এর নাম JSON properties এর সাথে ম্যাপ করতে পারে। তবে, কখনো কখনো JSON ফিল্ডের নাম এবং Java ফিল্ডের নাম ভিন্ন হতে পারে। এই ধরনের ক্ষেত্রে Jackson অ্যানোটেশন ব্যবহার করে properties-এর নাম পরিবর্তন করা যায়।


@JsonProperty অ্যানোটেশন

@JsonProperty অ্যানোটেশন ব্যবহার করে Java ফিল্ড এবং JSON ফিল্ডের মধ্যে একটি কাস্টম নাম ম্যাপিং নির্ধারণ করা যায়। এটি serialization (object → JSON) এবং deserialization (JSON → object) উভয় প্রক্রিয়ার সময় কাজ করে।


Serialization এবং Deserialization এর উদাহরণ

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

class User {
    @JsonProperty("user_name")
    private String name;

    @JsonProperty("user_age")
    private int age;

    public User() {} // Default constructor is required for deserialization

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class JsonPropertyExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Serialization: Object → JSON
        User user = new User("Alice", 25);
        String json = mapper.writeValueAsString(user);
        System.out.println("Serialized JSON: " + json);

        // Deserialization: JSON → Object
        String inputJson = "{\"user_name\":\"Bob\",\"user_age\":30}";
        User deserializedUser = mapper.readValue(inputJson, User.class);
        System.out.println("Deserialized User: " + deserializedUser.getName() + ", Age: " + deserializedUser.getAge());
    }
}

Output:

Serialized JSON: {"user_name":"Alice","user_age":25}
Deserialized User: Bob, Age: 30

@JsonAlias: Alternative Names for Deserialization

@JsonAlias অ্যানোটেশন ব্যবহার করে একটি ফিল্ডের জন্য একাধিক বিকল্প নাম নির্ধারণ করা যায়। এটি মূলত deserialization এর জন্য কার্যকর।

উদাহরণ:
import com.fasterxml.jackson.annotation.JsonAlias;

class User {
    @JsonAlias({"user_name", "username", "userName"})
    private String name;

    private int age;

    // Getters and Setters
}
Input JSON:
{
  "username": "Alice",
  "age": 25
}
Output:
Deserialized User: Alice, Age: 25

Global Configuration for Field Naming

Jackson-এর PropertyNamingStrategy ব্যবহার করে সমস্ত ফিল্ডের নাম পরিবর্তন করা সম্ভব। এটি snake_case, kebab-case, বা কাস্টম স্টাইল সেট করার জন্য কার্যকর।

Snake Case Naming Strategy:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;

public class SnakeCaseExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);

        User user = new User("Alice", 25);
        String json = mapper.writeValueAsString(user);
        System.out.println("Serialized JSON (Snake Case): " + json);
    }
}
Serialized Output:
{"name":"Alice","age":25}

Custom Serialization এবং Deserialization

কাস্টম সিরিয়ালাইজার বা ডেসিরিয়ালাইজার ব্যবহার করেও properties-এর নাম পরিবর্তন করা যায়।

Custom Serializer উদাহরণ:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

public class CustomUserSerializer extends StdSerializer<User> {
    public CustomUserSerializer() {
        super(User.class);
    }

    @Override
    public void serialize(User user, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("custom_name", user.getName());
        gen.writeNumberField("custom_age", user.getAge());
        gen.writeEndObject();
    }
}

Custom Deserializer উদাহরণ:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

public class CustomUserDeserializer extends StdDeserializer<User> {
    public CustomUserDeserializer() {
        super(User.class);
    }

    @Override
    public User deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonNode node = p.getCodec().readTree(p);
        String name = node.get("custom_name").asText();
        int age = node.get("custom_age").asInt();
        return new User(name, age);
    }
}

Configuration:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(User.class, new CustomUserSerializer());
module.addDeserializer(User.class, new CustomUserDeserializer());
mapper.registerModule(module);

সারাংশ

অ্যানোটেশন/কৌশলব্যবহার
@JsonPropertyJSON ফিল্ডের নাম এবং Java ফিল্ডের নাম কাস্টমাইজ করা।
@JsonAliasDeserialization-এর জন্য একাধিক বিকল্প নাম ব্যবহার।
PropertyNamingStrategyপুরো ফিল্ড নামকরণ স্ট্র্যাটেজি (যেমন, snake_case, kebab-case)।
Custom Serializer/Deserializerসম্পূর্ণ কাস্টম নিয়ম সংজ্ঞায়িত করার জন্য।

  1. @JsonProperty এবং @JsonAlias অ্যানোটেশন সহজ এবং কার্যকর সমাধান।
  2. PropertyNamingStrategy বড় প্রজেক্টের ক্ষেত্রে গ্লোবাল কনফিগারেশন প্রদান করে।
  3. কাস্টম নিয়মের প্রয়োজন হলে Custom Serializer/Deserializer ব্যবহার করতে হবে।

এই টুলগুলো ব্যবহার করে JSON ফিল্ড এবং Java properties-এর মধ্যে নির্ভুল এবং কার্যকর ম্যাপিং নিশ্চিত করা যায়।

Content added By
Promotion

Are you sure to start over?

Loading...