google

Gson Open Source Library สำหรับจัดการ JSON Formatter

“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

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

แชร์ประสบการณ์เข้าร่วมงาน Google HackFair Bangkok 2015

วันนี้อยากนำบรรยากาศดี ๆ ของงาน Google HackFair Bangkok ที่จัดขึ้น ณ C-asean ตึก Cyber World ถนนรัชดา งานนี้จัดขึ้น ณ วันเสาร์ที่ 19 ธันวาคม 2558  เวลา 9.00 – 17.30 น. เป็นครั้งแรกที่ได้เข้าร่วมงาน ที่ทาง Google ได้จัดขึ้น ก่อนหน้างานนี้ก็น่าจะเป็นงาน Google I/O Rewind ที่ผ่านมาครั้งนั้นพลาดไม่ได้ไปเข้าร่วมงานแต่ครั้งนี้ไม่พลาดครับ

งานครั้งนี้จัดขึ้นเพื่อใช้เป็นพื้นที่สำหรับนักสร้าง และนักพัฒนา ที่จะได้มาแสดงผลงานที่สร้างจากเทคโลโลยีของ Google ภายในงานมีการบรรยายจากผู้เชี่ยวชาญด้านเทคโนโลยีต่าง ๆ มาบรรยายให้ฟังกันยาวตลอดทั้งวันเลย เลยถือโอกาสเก็บภาพบรรยากาสภายในงานมาให้ได้ชมกัน

IMG_0079

ป้ายนำทางเพื่อเข้าสู่งาน

เริ่มด้วยงานนี้มีการให้ลงทะเบียนผ่านหน้า ฟอร์มลงทะเบียนของ Google Form แล้ววันงานจริงก็แจ้งชื่อการลงทะเบียนได้เลย แล้วก็จะได้รับของเหล่านี้มา

12395333_10205152690568000_391251671_n

ก่อนจะเดินเพื่อเข้าชมงานก็ต้องว่างแผนกันก่อนว่าจะไปตรงส่วนไหนของงานก่อนดี

IMG_0123

ช่วงเช้าร่วมเข้าฟัง Speaker บรรยาย

IMG_0087 IMG_0090

ท่านนี้คือทีมพัฒนา Drivebot (ภาพด้านบน)

ช่วงเช้าก็ได้เข้าฟังบรรยายได้ท่านเดียวรู้สึกว่าหิวเลยเดินออกมาหาของว่างท่าน ระหว่างทางก็ได้เข้าเดินดูนักพัฒนาไทยโชว์ผลงาน

IMG_0124 IMG_0119

IMG_0111 IMG_0107 IMG_0106 IMG_0103 IMG_0099

ไปท่านอาหารเที่ยงเสร็จก็เข้าไปฟังบรรยายช่วงบ่ายกันต่อ รอบนี้นั่งยาวกันจนถึงช่วงเย็นเลย

IMG_0135 IMG_0140 IMG_0143 IMG_0147

ท่านนี้คือ CEO ของ Do in Thai ดำเนินธุรกิจเกี่ยวกับ การวิจัย ออกแบบและพัฒนานวัตกรรมเชิงสังคม และพัฒนานวัตกรรมเพื่อการเรียนรู้ร่วมกันของผู้คนในโลกยุคใหม่ (ภาพประกอบด้านบน)

IMG_0148 IMG_0150 IMG_0152

 ท่านนี้เป็น CEO ของ EverGrow ดำเนินธุรกิจเกี่ยวการวิจัยนวัตกรรมการปลูกพืชแขนงไหม่ ในอนาคตคนในเมืองที่ไม่รุ้การปลูกพืชมาก่อนก็สามารถปลูกพืชได้โดยศึกษาข้อมูลจาก Data บน Cloud ของ EverGrow  (ภาพประกอบด้านบน)

IMG_0157 IMG_0162 IMG_0163 IMG_0168 IMG_0169 IMG_0175 IMG_0177

ท่านนี้เป็นทีมบริหารของ Google Admob เป็นช่องทางการทำเงินของนักพัฒนา แอพพิเคชั่นบนมือถือนั้นเอง (ภาพประกอบด้านบน)

IMG_0184 IMG_0187 IMG_0189 IMG_0190 IMG_0191 IMG_0192 IMG_0195

ท่านนี้คือ CEO ของบริษัท Kira Games เป็นทีมพัฒนาแอพพิเคชั่นอิสระในไทย พัฒนาเกมยอดฮิตอย่าง Unlock Me ที่มียอดการดาวน์โหลด เกิน 100 ล้าน ดาวน์โหลดเข้าไปแล้ว (ภานพประกอบด้านบน)

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