“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 ให้ได้เข้าไปดูวิธีการใช้งานเพิ่มเติมได้