Gson নিজে JSON ডেটা এবং Java অবজেক্টের মধ্যে রূপান্তরের জন্য ডিজাইন করা হলেও, অনেক সময় আমরা JSON ডেটার বৈধতা (validation) নিশ্চিত করতে চাই। যেমন, JSON ডেটার ফর্ম্যাট, ডেটার ধরণ, প্রয়োজনীয় ফিল্ড ইত্যাদি যাচাই করা। এই ধরনের যাচাই করতে আপনি Third-party tools বা লাইব্রেরি ব্যবহার করতে পারেন।
এখানে আমরা দেখবো কিভাবে Gson-এর সাথে validation এর জন্য কিছু জনপ্রিয় third-party লাইব্রেরি (যেমন Hibernate Validator বা Jackson) ইন্টিগ্রেট করা যায়।
1. Hibernate Validator Integration with Gson
Hibernate Validator হলো একটি জনপ্রিয় validation লাইব্রেরি যা Java Bean Validation (JSR 303/380) স্পেসিফিকেশন অনুসরণ করে। Hibernate Validator কে Gson এর সাথে ব্যবহার করলে JSON ডেটার ভিতরে থাকা Java Beans-এর বৈধতা পরীক্ষা করা যায়।
উদাহরণ: Gson এর সাথে Hibernate Validator ইন্টিগ্রেশন
- Maven Dependency: প্রথমে আপনাকে আপনার প্রকল্পে Hibernate Validator এবং Gson-এর ডিপেনডেন্সি যোগ করতে হবে।
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.0</version>
</dependency>
- Java Code: এখন আমরা Gson এবং Hibernate Validator একসাথে ব্যবহার করে JSON ডেটার বৈধতা যাচাই করবো।
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import org.hibernate.validator.HibernateValidator;
import org.hibernate.validator.constraints.Length;
import javax.validation.*;
import javax.validation.constraints.NotNull;
import java.util.Set;
class Person {
@NotNull(message = "Name cannot be null")
@Length(min = 3, message = "Name must be at least 3 characters")
String name;
@NotNull(message = "Age cannot be null")
Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"Jo\",\"age\":25}"; // Invalid name (length < 3)
// Gson object creation
Gson gson = new Gson();
// Deserialize the JSON to Person object
try {
Person person = gson.fromJson(json, Person.class);
// Initialize the validator factory
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// Validate the person object
Set<ConstraintViolation<Person>> violations = validator.validate(person);
if (!violations.isEmpty()) {
for (ConstraintViolation<Person> violation : violations) {
System.out.println(violation.getMessage());
}
} else {
System.out.println("Validation passed.");
}
} catch (JsonSyntaxException e) {
System.out.println("Invalid JSON format: " + e.getMessage());
}
}
}
আউটপুট:
Name must be at least 3 characters
ব্যাখ্যা:
- এখানে আমরা
Personক্লাসের মধ্যে কিছু Hibernate Validator এনোটেশন ব্যবহার করেছি যেমন@NotNullএবং@Length। gson.fromJson()দ্বারা JSON ডেটাকেPersonঅবজেক্টে রূপান্তর করার পর,Validatorএর মাধ্যমে বৈধতা যাচাই করা হয়েছে।- যদি JSON অবজেক্টটি সঠিক না হয়, তবে হাইবারনেট ভ্যালিডেটর সেই ত্রুটিগুলি প্রদর্শন করবে।
2. Jackson Validator Integration with Gson
Jackson হলো একটি JSON-এ কাজ করার জন্য আরেকটি জনপ্রিয় লাইব্রেরি, যা Gson-এর মতই JSON ডেটা সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করতে ব্যবহৃত হয়। Jackson-এও Validation করা যায়।
উদাহরণ: Gson এর সাথে Jackson Validation ইন্টিগ্রেশন
- Maven Dependency:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
- Java Code: এবার আমরা Jackson এবং Gson এর সাহায্যে JSON ডেটার মধ্যে Validation প্রয়োগ করব।
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.exc.MismatchedInputException;
import com.google.gson.Gson;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Set;
class Person {
@NotNull(message = "Name is required")
@Size(min = 3, message = "Name should have at least 3 characters")
String name;
@NotNull(message = "Age is required")
Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"Jo\",\"age\":25}"; // Invalid name (length < 3)
// Gson Object creation for JSON parsing
Gson gson = new Gson();
try {
// Deserialize JSON into Person Object
Person person = gson.fromJson(json, Person.class);
// Hibernate Validator initialization
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// Validate Person object
Set<javax.validation.ConstraintViolation<Person>> violations = validator.validate(person);
if (!violations.isEmpty()) {
for (javax.validation.ConstraintViolation<Person> violation : violations) {
System.out.println(violation.getMessage());
}
} else {
System.out.println("Validation passed.");
}
} catch (MismatchedInputException e) {
System.out.println("Invalid JSON format: " + e.getMessage());
}
}
}
আউটপুট:
Name should have at least 3 characters
ব্যাখ্যা:
- Jackson এবং Gson উভয় ব্যবহার করে JSON ডেটা সিরিয়ালাইজ এবং ডেসিরিয়ালাইজ করা হয়েছে।
- এখানে Jackson এর মাধ্যমে ObjectMapper ব্যবহার করা হয়েছে, এবং Gson এর মাধ্যমে validation করা হয়েছে।
3. Using JSON Schema Validation
আরেকটি উপায় JSON ডেটার বৈধতা যাচাই করার জন্য হলো JSON Schema ব্যবহার করা। এটি JSON ডেটার স্ট্রাকচার এবং কন্টেন্ট ভ্যালিডেট করার একটি শক্তিশালী পদ্ধতি। এই উদ্দেশ্যে everit-org/json-schema লাইব্রেরি ব্যবহার করা যায়।
উদাহরণ: JSON Schema Validation
- Maven Dependency:
<dependency>
<groupId>org.everit.json</groupId>
<artifactId>json-schema</artifactId>
<version>1.14.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
- Java Code:
import com.google.gson.Gson;
import org.everit.json.schema.Schema;
import org.everit.json.schema.loader.SchemaLoader;
import org.json.JSONObject;
import org.json.JSONTokener;
public class Main {
public static void main(String[] args) {
String json = "{\"name\":\"John\", \"age\":30}";
String schemaString = "{\n" +
" \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n" +
" \"type\": \"object\",\n" +
" \"properties\": {\n" +
" \"name\": { \"type\": \"string\" },\n" +
" \"age\": { \"type\": \"integer\" }\n" +
" },\n" +
" \"required\": [\"name\", \"age\"]\n" +
"}";
// Create a JSON object for the schema
JSONObject jsonSchema = new JSONObject(new JSONTokener(schemaString));
// Load the schema
Schema schema = SchemaLoader.load(jsonSchema);
// Create a JSON object to validate
JSONObject jsonObject = new JSONObject(json);
// Validate JSON object against the schema
try {
schema.validate(jsonObject);
System.out.println("JSON is valid according to the schema");
} catch (Exception e) {
System.out.println("JSON validation error: " + e.getMessage());
}
}
}
আউটপুট:
JSON is valid according to the schema
ব্যাখ্যা:
- এখানে JSON Schema ব্যবহার করে JSON ডেটা স্ট্রাকচার যাচাই করা হয়েছে। Schema নির্দিষ্ট করেছে যে
nameএবংageফিল্ড দুটি থাকতে হবে এবংnameফিল্ডটি string টাইপের এবংageফিল্ডটি integer টাইপের হতে হবে। - JSON Schema ত্রুটি শনাক্ত করলে, তা ব্যতিক্রমের মাধ্যমে জানানো হয়।
Validation JSON ডেটার জন্য গুরুত্বপূর্ণ, বিশেষ করে যখন আপনার ডেটা ভিন্ন সোর্স থেকে আসে এবং আপনি নিশ্চিত হতে চান যে এটি সঠিক ফরম্যাট এবং মানের। Gson এর সাথে third-party validation লাইব্রেরি যেমন Hibernate Validator, Jackson, এবং JSON Schema ব্যবহার করে আপনি সহজেই JSON ডেটার বৈধতা যাচাই করতে পারেন।
Read more