“JSON” ไม่ใช่เรื่องใหม่อะไร เพราะปัจจุบันมีการใช้งานกันอย่างแพร่หลาย สำหรับเอาไว้ใช้จัดการข้อมูลรับส่งระหว่าง frontend และ backend เพราะด้วยความง่ายและดูเป็นมาตฐาน มีรูปแบบที่ตายตัว ที่ใคร ๆ ก็สามารถเข้าใจได้เพราะเป็นการเก็บข้อมูลแบบ Key และ value
Java Library ที่ใช้สำหรับจัดการ JSON Data ก็มีมากมายให้ได้เลือกใช้งาน เช่น Google-Gson Library ,Flexjson ,Json-io ,Genson ,JSONiJ ,Jackson ,JSON-lib เป็นต้น ผมเองเป็นคนนึงที่นิยมใช้งาน Library ที่เป็น Open Source และต้องมีกลุ่ม Community ที่ใหญ่ และ Gson เองก็ได้รับความนิยมมาก เพราะด้วยความง่ายในการใช้งาน
การเริ่มใช้งาน Gson
เพิ่ม dependency
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.2</version>
</dependency>
การใช้งานเบื้องต้นของ Gson จะมีด้วยกัน 2 รูปแบบ ด้วยกัน คือ Serialization ,Deserialization
Serialization การแปลงข้อมูลที่อยู่ในรูปแบบ Object ไปเป็น Json String Format
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 การแปลงข้อมูลในรูปแบบ Json String Format ไปเป็น Object
int one = gson.fromJson("1", int.class);
Integer one = gson.fromJson("1", Integer.class);
Long one = gson.fromJson("1", Long.class);
Boolean false = gson.fromJson("false", Boolean.class);
String str = gson.fromJson("\"abc\"", String.class);
String[] anotherStr = gson.fromJson("[\"abc\"]", String[].class);
ตัวอย่างการใช้งานง่าย ๆ
สร้าง POJO Class
public class EasyObject {
private String valueString;
private int valueInteger;
private Date valueDate;
private boolean valueBoolean;
// getter , setter
@Override@Override public String toString() { return "EasyObject [valueString=" + valueString + ", valueInteger=" + valueInteger + ", valueDate=" + valueDate + ", valueBoolean=" + valueBoolean + "]"; }
}
ตัวอย่าง Method Serialization
private void exampleSerialization(){
EasyObject easy = new EasyObject();
easy.setValueBoolean(true);
easy.setValueDate(new Date());
easy.setValueInteger(999);
easy.setValueString("poolsawat.com");
//Serialization
System.out.println("serialization :: "+new Gson().toJson(easy));
}
/*
serialization :: {"valueString":"poolsawat.com","valueInteger":999,"valueDate":"Oct 4, 2017 9:35:34 PM","valueBoolean":true}
*/
ตัวอย่าง Method Deserialization
private void exampleDeserialization(){
String json = "{\"valueString\":\"poolsawat.com\",\"valueInteger\":999,\"valueDate\":\"Oct 4, 2017 9:30:08 PM\",\"valueBoolean\":true}";
EasyObject easy = new Gson().fromJson(json, EasyObject.class);
System.out.println("deserialization :: "+easy.toString());
}
/*
deserialization :: EasyObject [valueString=poolsawat.com, valueInteger=999, valueDate=Wed Oct 04 21:30:08 ICT 2017, valueBoolean=true]
*/
เมื่อใช้งาน Gson ไปสักระยะก็จะพบปัญหา หรือ สิ่งที่อยากปรับแต่งกับข้อมูลผลลัพธ์ให้เป็นไปตามความต้องการ Gson เองก็มี GsonBuilder Class สำหรับให้เอาไว้ Custom Serialization and Deserialization
ตัวอย่างการแสดงผลลัพธ์ทาง Console ให้อยู่ในรูปแบบที่สวยงานโดยการ กำหนด PrettyPrinting
private void examplePrettyPrinting(){
EasyObject easy = new EasyObject();
easy.setValueBoolean(true);
easy.setValueDate(new Date());
easy.setValueInteger(999);
easy.setValueString("poolsawat.com");
//Serialization
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println("serialization :: "+gson.toJson(easy));
}
/*
serialization :: {
"valueString": "poolsawat.com",
"valueInteger": 999,
"valueDate": "Oct 4, 2017 9:54:58 PM",
"valueBoolean": true
}*/
ตัวอย่างต้องการ custom field ที่มี value เป็น null อยากที่จะให้แสดงผลลัพธ์ field ที่เป็น null นั้นออกมาด้วยจำเป็นต้องกำหนด ให้ .serializeNulls()
private void exampleSerializeNulls(){
EasyObject easy = new EasyObject();
easy.setValueBoolean(true);
//easy.setValueDate(new Date());
easy.setValueInteger(999);
easy.setValueString("poolsawat.com");
//Serialization exclude null
Gson gson = new GsonBuilder().setPrettyPrinting()
.create();
System.out.println("serialization exlude null:: "+gson.toJson(easy));
//Serialization exclude null
gson = new GsonBuilder().setPrettyPrinting()
.serializeNulls()
.create();
System.out.println("serialization want null :: "+gson.toJson(easy));
}
/*
serialization exlude null:: {
"valueString": "poolsawat.com",
"valueInteger": 999,
"valueBoolean": true
}
serialization want null :: {
"valueString": "poolsawat.com",
"valueInteger": 999,
"valueDate": null,
"valueBoolean": true
}*/
หากต้องการที่จะกำหนดชื่อใหม่ให้กับ key name ก็สามารถทำได้ โดยไม่ด้วยกัน 2 วิธี คือการกำหนดผ่าน annotation @SerializedName และ anonymous inner type การ setFieldNamingStrategy
@SerializedName("rename_valueBoolean") // เพิ่มเข้า
private boolean valueBoolean;
private void exampleRenameFieldKeyWithAnnotation(){
EasyObject easy = new EasyObject();
easy.setValueBoolean(true);
//easy.setValueDate(new Date());
easy.setValueInteger(999);
easy.setValueString("poolsawat.com");
Gson gson = new GsonBuilder().setPrettyPrinting()
.create();
System.out.println("serialization :: "+gson.toJson(easy));
}
/*
serialization :: {
"valueString": "poolsawat.com",
"valueInteger": 999,
"rename_valueBoolean": true
}
*/
private boolean valueBoolean; // ไม่ต้องมี annotation แล้ว
private void exampleRenameFieldKeyWithAnonymous(){
EasyObject easy = new EasyObject();
easy.setValueBoolean(true);
//easy.setValueDate(new Date());
easy.setValueInteger(999);
easy.setValueString("poolsawat.com");
Gson gson = new GsonBuilder().setPrettyPrinting()
.setFieldNamingStrategy(new FieldNamingStrategy() {
public String translateName(Field f) {
if (f.getName().equals("valueBoolean"))
return "rename_valueBoolean";
else
return f.getName();
}
})
.create();
System.out.println("serialization :: "+gson.toJson(easy));
}
/*
serialization :: {
"valueString": "poolsawat.com",
"valueInteger": 999,
"rename_valueBoolean": true
}
*/
สำหรับการกำหนดรุปแบบ format ให้ field ที่เป็น type date ก็สามารถกำหนดให้ได้ด้วยการกำหนด setDateFormat ตาม format ที่เรากำหนดเองได้เลย
private void exampleDateFormat(){
EasyObject easy = new EasyObject();
easy.setValueBoolean(true);
easy.setValueDate(new Date());
easy.setValueInteger(999);
easy.setValueString("poolsawat.com");
Gson gson = new GsonBuilder().setPrettyPrinting()
.setDateFormat("dd/MM/yyyy HH:mm:ss")
.create();
System.out.println("serialization dd/MM/yyyy HH:mm:ss :: "+gson.toJson(easy));
gson = new GsonBuilder().setPrettyPrinting()
.setDateFormat("yyyy/MM/dd")
.create();
System.out.println("serialization yyyy/MM/dd :: "+gson.toJson(easy));
}
/*
serialization dd/MM/yyyy HH:mm:ss :: {
"valueString": "poolsawat.com",
"valueInteger": 999,
"valueDate": "04/10/2017 22:29:53",
"rename_valueBoolean": true
}
serialization yyyy/MM/dd :: {
"valueString": "poolsawat.com",
"valueInteger": 999,
"valueDate": "2017/10/04",
"rename_valueBoolean": true
}
*/
ในบางครั้งเราก็ไม่ต้องการสร้าง POJO สำหรับการเก็บ Data ชุดใหม่ Gson ก็มี Class สำหรับสร้าง Json Object เองได้สำหรับคนที่อยากกำหนด key ที่หลากหลาย
private void exampleJsonObject(){
JsonObject object = new JsonObject();
object.addProperty("blog_title", "Gson Open Source Library สำหรับจัดการ JSON Formatter");
object.addProperty("blog_content", "“JSON” ไม่ใช่เรื่องใหม่อะไร เพราะปัจจุบันมีการ...");
object.addProperty("blog_date", "04/10/2017");
object.addProperty("blog_author", "poolsawat apin");
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println("serialization JsonObject :: "+gson.toJson(object));
}
/*
serialization JsonObject :: {
"blog_title": "Gson Open Source Library สำหรับจัดการ JSON Formatter",
"blog_content": "“JSON” ไม่ใช่เรื่องใหม่อะไร เพราะปัจจุบันมีการ...",
"blog_date": "04/10/2017",
"blog_author": "poolsawat apin"
}
*/
อยากสร้างในรูปแบบของ Json Array ก็สามารถทำได้
private void exampleJsonArray(){
JsonArray array = new JsonArray();
JsonObject object1 = new JsonObject();
object1.addProperty("blog_title", "Gson Open Source Library สำหรับจัดการ JSON Formatter");
object1.addProperty("blog_content", "“JSON” ไม่ใช่เรื่องใหม่อะไร เพราะปัจจุบันมีการ...");
object1.addProperty("blog_date", "04/10/2017");
object1.addProperty("blog_author", "poolsawat apin");
array.add(object1);
JsonObject object2 = new JsonObject();
object2.addProperty("blog_title", "สร้าง Spring MVC 4 ร่วมกับ Apache Tiles 3");
object2.addProperty("blog_content", "สำหรับงานพัฒนาเว็บไซต์ด้วยภาษา Java มี Frameworks ให้เลือกอย่างมากมาย ...");
object2.addProperty("blog_date", "15/09/2017");
object2.addProperty("blog_author", "poolsawat apin");
array.add(object2);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
System.out.println("serialization JsonArray :: "+gson.toJson(array));
}
/*
serialization JsonArray :: [
{
"blog_title": "Gson Open Source Library สำหรับจัดการ JSON Formatter",
"blog_content": "“JSON” ไม่ใช่เรื่องใหม่อะไร เพราะปัจจุบันมีการ...",
"blog_date": "04/10/2017",
"blog_author": "poolsawat apin"
},
{
"blog_title": "สร้าง Spring MVC 4 ร่วมกับ Apache Tiles 3",
"blog_content": "สำหรับงานพัฒนาเว็บไซต์ด้วยภาษา Java มี Frameworks ให้เลือกอย่างมากมาย ...",
"blog_date": "15/09/2017",
"blog_author": "poolsawat apin"
}
]
*/
เหล่านี้เป็นตัวอย่างการใช้งานเบื้องต้นส่วนหนึ่งเท่านั้น มี UserGuide ให้ได้เข้าไปดูวิธีการใช้งานเพิ่มเติมได้