Gson এর মাধ্যমে JSON Parsing Efficiency বৃদ্ধি করা

Gson এর সাথে অন্যান্য লাইব্রেরির Integration - জিসন (Gson) - Java Technologies

383

Gson ব্যবহার করে JSON পার্সিং (JSON Parsing) এর কার্যকারিতা বা efficiency বৃদ্ধি করার কিছু কৌশল এবং প্রযুক্তি আছে, যা বড় JSON ডেটা সেট এবং কম্প্লেক্স অবজেক্ট গঠনের ক্ষেত্রে পারফরম্যান্স উন্নত করতে সাহায্য করতে পারে। Gson সাধারণত খুবই কার্যকরী, তবে কিছু উন্নত কৌশল ব্যবহারের মাধ্যমে পার্সিং এর গতি আরও দ্রুত করা যেতে পারে।

1. Streaming API ব্যবহার (JsonReader / JsonWriter)

Gson এর streaming API (JsonReader এবং JsonWriter) ব্যবহার করে আপনি JSON ডেটাকে স্ট্রিম আকারে পার্স করতে পারেন, যা মেমরি ব্যবহার কমায় এবং বড় JSON ডেটা সেটের পার্সিং আরো দ্রুত করতে সাহায্য করে। এতে আপনি ডেটাকে একটানা প্রক্রিয়া করতে পারেন, যেমন একটি JSON অ্যারে বা অবজেক্ট পড়া।

এটি whole object-এর বদলে শুধুমাত্র প্রয়োজনীয় অংশগুলি পড়ার অনুমতি দেয়, যার ফলে মেমরি খরচ কম হয় এবং পারফরম্যান্স বেড়ে যায়।

JsonReader উদাহরণ:

import com.google.gson.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        String json = "{\n" +
                "  \"name\": \"John\",\n" +
                "  \"age\": 30,\n" +
                "  \"address\": {\n" +
                "    \"street\": \"123 Main St\",\n" +
                "    \"city\": \"New York\"\n" +
                "  },\n" +
                "  \"phoneNumbers\": [\"123-456-7890\", \"987-654-3210\"]\n" +
                "}";

        JsonReader reader = new JsonReader(new StringReader(json));
        reader.setLenient(true); // Allow lenient parsing for non-strict JSON
        
        // Stream JSON data
        while (reader.hasNext()) {
            JsonToken token = reader.peek();
            if (token.equals(JsonToken.BEGIN_OBJECT)) {
                reader.beginObject(); // Enter JSON object
                while (reader.hasNext()) {
                    String name = reader.nextName(); // Get key
                    if (name.equals("name")) {
                        String value = reader.nextString(); // Read value
                        System.out.println("Name: " + value);
                    } else {
                        reader.skipValue(); // Skip other values
                    }
                }
                reader.endObject();
            } else {
                reader.skipValue(); // Skip if it's not an object
            }
        }
        reader.close();
    }
}

2. GsonBuilder ব্যবহার করে Performance Optimizaton

GsonBuilder-এ কিছু কনফিগারেশন সেটিংস ব্যবহার করলে পার্সিং এর গতি বৃদ্ধি পায়। যেমন, excludeFieldsWithoutExposeAnnotation সেটিংটি ব্যবহার করলে আপনি যেসব ফিল্ডে @Expose অ্যানোটেশন ব্যবহার করেন সেগুলোকেই পার্স করবেন, আর বাকি ফিল্ডগুলি বাদ দিয়ে JSON ডেটা দ্রুত পার্স করা যাবে।

GsonBuilder Optimization:

import com.google.gson.*;

public class Main {
    public static void main(String[] args) {
        // GsonBuilder এর মাধ্যমে একাধিক অপটিমাইজেশন
        Gson gson = new GsonBuilder()
                        .excludeFieldsWithoutExposeAnnotation() // @Expose ব্যবহার করা ফিল্ডগুলোকেই পার্স করুন
                        .serializeNulls() // Null মানগুলোকেও JSON এ অন্তর্ভুক্ত করুন
                        .disableHtmlEscaping() // HTML অ্যাক্টিভিটি এড়িয়ে চলুন
                        .create();

        String json = "{\"name\":\"John\", \"age\":30}";

        // JSON ডেটা ডেসিরিয়ালাইজ করা
        Person person = gson.fromJson(json, Person.class);
        System.out.println(person.name);
    }
}

class Person {
    @Expose
    String name;

    int age;
}

3. TypeAdapter কাস্টমাইজেশন (Custom TypeAdapter)

যদি আপনার অবজেক্টগুলির ডেটা খুব কমপ্লেক্স বা কাস্টম থাকে, তবে TypeAdapter তৈরি করে পার্সিংয়ের গতি বাড়ানো যেতে পারে। TypeAdapter সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন প্রক্রিয়াকে কাস্টমাইজ করতে এবং আরও কার্যকরী করতে সাহায্য করে।

TypeAdapter উদাহরণ:

import com.google.gson.*;

import java.lang.reflect.Type;

class Person {
    String name;
    int age;

    // কন্সট্রাকটর
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

class PersonAdapter extends TypeAdapter<Person> {
    @Override
    public void write(JsonWriter out, Person person) throws IOException {
        out.beginObject();
        out.name("name").value(person.name);
        out.name("age").value(person.age);
        out.endObject();
    }

    @Override
    public Person read(JsonReader in) throws IOException {
        in.beginObject();
        String name = null;
        int age = 0;
        while (in.hasNext()) {
            String fieldName = in.nextName();
            if (fieldName.equals("name")) {
                name = in.nextString();
            } else if (fieldName.equals("age")) {
                age = in.nextInt();
            } else {
                in.skipValue();
            }
        }
        in.endObject();
        return new Person(name, age);
    }
}

public class Main {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
                        .registerTypeAdapter(Person.class, new PersonAdapter())
                        .create();

        String json = "{\"name\":\"John\",\"age\":30}";

        // JSON ডেটা ডেসিরিয়ালাইজ করা
        Person person = gson.fromJson(json, Person.class);
        System.out.println(person.name + " - " + person.age);
    }
}

এখানে, TypeAdapter ব্যবহার করা হয়েছে যা একটি কাস্টম সিরিয়ালাইজেশন এবং ডেসিরিয়ালাইজেশন প্রক্রিয়া তৈরি করে। এটি পার্সিং এর সময় অপটিমাইজেশনে সাহায্য করতে পারে, বিশেষ করে যখন JSON অবজেক্টগুলির গঠন জটিল হয়।

4. Parallel Processing (Multithreading)

যদি আপনার JSON ডেটার সাইজ খুব বড় হয় এবং একাধিক অবজেক্ট বা ফাইল থাকে, তবে multithreading ব্যবহার করে JSON ডেটার পার্সিংয়ের কার্যকারিতা বৃদ্ধি করা সম্ভব। উদাহরণস্বরূপ, JSON ডেটা টুকরো টুকরো করে বিভক্ত করে একাধিক থ্রেডে পার্স করা হতে পারে।

import com.google.gson.Gson;
import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        String json = "{ \"name\": \"John\", \"age\": 30 }";
        ExecutorService executor = Executors.newFixedThreadPool(2);
        
        // Task 1: JSON Parsing
        Future<Person> task1 = executor.submit(() -> new Gson().fromJson(json, Person.class));
        
        // Task 2: Another Parsing (if required)
        Future<Person> task2 = executor.submit(() -> new Gson().fromJson(json, Person.class));
        
        // Waiting for both tasks to complete
        Person person1 = task1.get();
        Person person2 = task2.get();
        
        System.out.println(person1.name);
        System.out.println(person2.name);
        
        executor.shutdown();
    }
}

class Person {
    String name;
    int age;
}

এখানে দুটি থ্রেডে JSON ডেটা পার্স করা হয়েছে, যার ফলে পার্সিং প্রক্রিয়া দ্রুত হতে পারে।

5. Lazy Loading (ডাটা লোড করা শুধু যখন প্রয়োজন হয়)

একই JSON ডেটায় এমন অনেক ফিল্ড থাকতে পারে যেগুলি প্রক্রিয়া করার জন্য প্রয়োজনীয় নয়। এমন ক্ষেত্রে lazy loading ব্যবহার করা যেতে পারে, যেখানে প্রয়োজন না হলে কিছু ফিল্ডকে পার্স না করাই সবচেয়ে কার্যকরী পন্থা।

Gson এর JsonObject ব্যবহার করে আপনি যেকোনো নির্দিষ্ট ফিল্ডকে দ্বিতীয়বার অ্যাক্সেস করতে পারবেন, যার ফলে unnecessary parsing এড়ানো সম্ভব।


সারসংক্ষেপ:

  1. Streaming API ব্যবহার: JsonReader এবং JsonWriter ব্যবহার করে আপনি JSON ডেটাকে স্ট্রিম আকারে পার্স করতে পারেন, যা মেমরি খরচ কমায় এবং পারফরম্যান্স বৃদ্ধি করে।
  2. GsonBuilder অপটিমাইজেশন: কিছু কনফিগারেশন ব্যবহার করে পার্সিং কার্যকারিতা বাড়ানো যায়, যেমন excludeFieldsWithoutExposeAnnotation, serializeNulls, ইত্যাদি।
  3. Custom TypeAdapter: কাস্টম TypeAdapter ব্যবহার করে সিরিয়ালাইজেশন ও ডেসিরিয়ালাইজেশন কাস্টমাইজ করতে পারেন, যা পার্সিংয়ের কার্যকারিতা বৃদ্ধি করতে সহায়ক।
  4. Parallel Processing: বড় JSON ডেটা সেটগুলিকে multithreading ব্যবহার করে দ্রুত পার্স করা সম্ভব।
  5. Lazy Loading: শুধুমাত্র প্রয়োজনীয় ফিল্ডগুলো পার্স করা, যা মেমরি খরচ কমাতে এবং পার্সিং কার্যকারিতা বাড়াতে সাহায্য করে।

এই কৌশলগুলো ব্যবহার করে Gson এর মাধ্যমে JSON পার্সিংয়ের কার্যকারিতা বৃদ্ধি করা সম্ভব, বিশেষ করে যখন JSON ডেটা বড় এবং জটিল হয়।

Content added By
Promotion

Are you sure to start over?

Loading...