รู้จักกับ Gson Library Android

Gson คืออะไร

Gson เป็น library ตัวหนึ่งของ java ที่ใช้แปลงข้อมูลระหว่าง Object และ JSON ได้อย่างง่ายดาย ( โดยปกติแล้วเราจะต้องแกะ JSON เองก่อนเก็บค่าลง Object ที่เราต้องการใช้งาน สามารถดูตัวอย่างได้จากบทความ “สอนใช้งาน JSON บน Andorid” ) วันนี้เรามาแนะนำวิธีการใช้งาน Gson ในรูปแบบต่างๆที่ใช้งานบ่อย

วิธีการติดตั้ง
compile 'com.google.code.gson:gson:2.6.2'

 

รูปแบบการใช้งานของ Gson

1.Primitive Types

2.Object

3.Array

4.Custom Serialization and Deserialization

5.Null Object Support

6.Excluding Fields From Serialization and Deserialization

7.JSON Field Naming Support

 

ทำความเข้าใจศัพท์สำคัญก่อน

1.Serialization คือการแปลงข้อมูลจาก Object ให้อยู่ในรูปแบบข้อมูลที่มีมาตรฐาน เพื่อให้สามารถแกะข้อมูลออกมาได้

2.Deserialization คือการแกะข้อมูลที่มีเป็น Object ให้พร้อมใช้งาน

 

1.ตัวอย่างการใช้งาน Primitive Types
// Serialization
Gson gson = new Gson();
gson.toJson(1);            // ==> 1
gson.toJson("abcd");       // ==> "abcd"
gson.toJson(new Long(10)); // ==> 10
int[] values = { 1 };
gson.toJson(values);       // ==> [1]


// Deserialization
int one = gson.fromJson("1", int.class);
Integer one = gson.fromJson("1", Integer.class);
Long one = gson.fromJson("1", Long.class);
Boolean bool = gson.fromJson("false", Boolean.class);
String str = gson.fromJson("\"abc\"", String.class);
String anotherStr = gson.fromJson("[\"abc\"]", String.class);

ตัวอย่างการใช้งานจริง
Gson gson = new Gson();
// Serialization and Deserialization int
String oneString = gson.toJson(1); 
int one = gson.fromJson(oneString, int.class);    // ==> 1
// Serialization and Deserialization String
String input = gson.toJson("abcd");
String output = gson.toJson(input, String.class); // ==> "abcd"
2.ตัวอย่างการใช้งาน Object
public class Project {
    private Integer id;
    private String name;
    private String detail;

    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }

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

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }
}
// Serialization
Project project = new Project();
project.setName("Growthd");
project.setDetail("Freelance");
Gson gson = new Gson();
String json = gson.toJson(project); // ==> {"name":"growthd", "detail":"freelance"}
// สำหรับ Field Id จะไม่แสดงผลใน Json เนื่องจากไม่ได้กำหนด id ไว้ใน Project Class หากต้องการให้แสดงผลจำเป็นต้องกำหนด Gson ให้ Support null value ซึ่งอยู่ในหัวข้อที่ 5

// deserialization 
Project project1 = gson.fromJson(json, Project.class);

จากตัวอย่างด้านบนเราจะสามารถเก็บ Object ในรูปแบบ Json และดึงค่ากลับมาใช้งานได้เพียงเขียนคำสั่งสั้นๆเท่านั้น

 

3.ตัวอย่างการใช้งาน Array
Gson gson = new Gson();
int[] intArray = {1, 2, 3, 4, 5};
String[] json = {"abc", "def", "ghi"};


// Serialization
gson.toJson(intArray); // ==> prints [1,2,3,4,5]
gson.toJson(strings); // ==> prints ["abc", "def", "ghi"]

// Deserialization
int[] intArray2 = gson.fromJson("[1,2,3,4,5]", int[].class);

 

4.ตัวอย่างการทำ Custom Serialization and Deserialization

วิธีการที่เราจะทำคือ บอก Gson ให้รู้ว่าถ้าเจอ Custom Class เราจะเป็นคนแกะข้อมูลให้เอง

ตัวอย่างการใช้งาน

GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(DateTime.class, new DateTime());

// Serialization
private class DateTimeSerializer implements JsonSerializer<DateTime> {
  public JsonElement serialize(DateTime src, Type typeOfSrc, JsonSerializationContext context) {
    // กำหนด Json ในแบบเราต้องการ
    return new JsonPrimitive(src.toString());
  }
}

// Deserialization
private class DateTimeDeserializer implements JsonDeserializer<DateTime> {
  public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException {
    // แกะ Json ออกมาและส่ง Object กลับไป
    return new DateTime(json.getAsJsonPrimitive().getAsString());
  }
}

 

สำหรับการ Register เพื่อให้ Gson รู้ว่าถ้าเจอ DateTime Class ตัว Gson จะไม่ Serialize ตามแบบ Object ปกติ แต่จะแปลงให้ตาม DateTimeSerializer Class และ แกะข้อมูลตาม DateTimeDeserializer Class

5.วิธีการรองรับ Null Object
public class Project {
    private Integer id;
    private String name;
    private String detail;

    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }

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

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }
}

Project project = new Project();
project.setName("growthd");
project.setDetail("freelance");

Gson gson = new GsonBuilder().serializeNulls().create();
String json = gson.toJson(project); // {"name":"growthd", "detail":"freelance", "id" : null}

จากตัวอย่างนี้เห็นว่าไม่มีการ set id ให้กับ project แต่เนื่องจากกำหนด Gson support null value ทำให้ข้อมูลหลังจาก Serialize มี field id ได้ค่าเป็น null

 

6.วิธีการ Excluding Fields

การ Exclude Field คือวิธีบอก Gson สำหรับ Field ที่เราไม่ต้องการให้ Serialize กำหนดได้ 2 วิธี

1.excludeFieldsWithModifiers คือการบอก Gson ให้แปลงข้อมูลยกเว้นชนิดตัวแปร 3 ชนิด STATIC, TRANSIENT, VOLATILE ขึ้้นกับเรากำหนดใน code

Gson gson = new GsonBuilder()
    .excludeFieldsWithModifiers(Modifier.STATIC)
    .create();

Gson gson = new GsonBuilder()
    .excludeFieldsWithModifiers(Modifier.STATIC, Modifier.TRANSIENT, Modifier.VOLATILE)
    .create();

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()

2.excludeFieldsWithoutExposeAnnotation คือการบอก Gson ให้แปลงข้อมูลทุกตัวที่มี @Expose

Gson gson = new GsonBuilder()
    .excludeFieldsWithModifiers(Modifier.STATIC)
    .create();

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
ตัวอย่างการใช้งาน
public class User {
    
    public static final int TYPE = 1;

    @Expose
    private String username;

    private String password;

}

Gson gson = new GsonBuilder()
    .excludeFieldsWithModifiers(Modifier.STATIC)
    .excludeFieldsWithoutExposeAnnotation()
    .create();

หลังจาก Serialize แล้วจะได้ข้อมูล username เพียง field เดียว

 

7.วิธีการเปลี่ยนชื่อ Fields (JSON Field Naming Support)

ตัวอย่างการใช้งาน
public class User {
    
    @SerializedName("user_name")
    private String username; 
    
    private String password;
 }

 

หลังจาก Serialize แล้วจะได้ข้อมูลที่มีการเปลี่ยนชื่อ Field ตามที่เราระบุ

{"user_name":"growthd", "password":"123456"}

 

หากใครสนใจสามารถเข้าไปอ่านรายละเอียดเพิ่มเติมได้ที่ https://github.com/google/gson/blob/master/UserGuide.md

สรุป

บทความนี้แท้จริงแล้วต้องการปูพื้นฐานให้นักพัฒนาเข้าใจว่า Gson ใช้ทำอะไรก่อนที่จะเริ่มต้นใช้งาน Retrofit 2 Library Network สำหรับคนที่เบื่อการแกะ Json ไปๆมาๆ ลองอ่านบทความนี้ครับ Retrofit 2