ขณะ Parse JSON String ไป/มาจาก Java Object โดย Default Gson จะพยายามสร้าง Instance ของ Java Class โดยเรียก Default Constructor หาก Class ไม่มี Default Constructor หรือต้องการ Initial Configuration ระหว่างสร้าง Object ต้องสร้างและ Register Custom Instance Creator เอง
สร้าง Custom Instance Creator ใน Gson โดย Implement Interface InstanceCreator และ Override เมธอด createInstance(Type type)
Syntax
T createInstance(Type type)
ตัวอย่าง: Custom Instance Creator สำหรับ Class ที่ไม่มี Default Constructor
import java.lang.reflect.Type;
import com.google.gson.*;
public class CustomInstanceCreatorTest {
public static void main(String[] args) {
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Course.class, new CourseCreator());
Gson gson = gsonBuilder.create();
String jsonString = "{'course1':'Core Java', 'course2':'Advanced Java'}";
Course course = gson.fromJson(jsonString, Course.class);
System.out.println(course);
}
}
// Course class - ไม่มี Default Constructor
class Course {
private String course1;
private String course2;
private String technology;
public Course(String technology) { // Constructor ต้องมี Parameter
this.technology = technology;
}
public void setCourse1(String course1) { this.course1 = course1; }
public void setCourse2(String course2) { this.course2 = course2; }
public String getCourse1() { return course1; }
public String getCourse2() { return course2; } // Bug ในโค้ดต้นฉบับ: คืน course1
public void setTechnology(String technology) { this.technology = technology; }
public String getTechnology() { return technology; }
public String toString() {
return "Course[ course1 = " + course1 + ", course2 = " + course2 +
", technology = " + technology + " ]";
}
}
// CourseCreator implements InstanceCreator
class CourseCreator implements InstanceCreator<Course> {
@Override
public Course createInstance(Type type) {
Course course = new Course("Java"); // สร้าง Instance ด้วย Constructor ที่มี Parameter
return course;
}
}
ผลลัพธ์
Course[ course1 = Core Java, course2 = Advanced Java, technology = Java ]
สรุป: ใช้ GsonBuilder.registerTypeAdapter(Class, InstanceCreator) ลงทะเบียน Creator สำหรับ Class เป้าหมาย เหมาะกับ Class ที่มี Constructor บังคับ Parameter หรือต้องการ Initialization Logic พิเศษ