ภาพรวม
Gson เป็นไลบรารีของ Google สำหรับแปลงระหว่าง Java Object ↔ JSON ใช้งานง่าย ประสิทธิภาพดี รองรับ Generic Type ทำให้เหมาะสำหรับแปลง ArrayList/List เป็น JSON String และกลับกัน
การติดตั้ง
build.gradle (Module: app)
dependencies {
// ... อื่นๆ
implementation 'com.google.code.gson:gson:2.10.1' // เวอร์ชันล่าสุด (2024)
}
ตัวอย่างการใช้งาน
1. Layout (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<TextView
android:id="@+id/tvResult"
android:layout_width="0dp"
android:layout_height="0dp"
android:textSize="16sp"
android:lineSpacingExtra="4dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2. MainActivity.java
package com.example.myapplication;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private TextView tvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvResult = findViewById(R.id.tvResult);
// 1. ArrayList → JSON String
demonstrateToJson();
// 2. JSON String → ArrayList (Bonus)
demonstrateFromJson();
}
private void demonstrateToJson() {
List languages = new ArrayList<>(Arrays.asList(
"Java", "Kotlin", "Python", "JavaScript", "Go", "Rust"
));
Gson gson = new Gson();
String json = gson.toJson(languages);
appendResult("=== ArrayList → JSON ===");
appendResult("Original: " + languages);
appendResult("JSON: " + json);
// ผลลัพธ์: ["Java","Kotlin","Python","JavaScript","Go","Rust"]
}
private void demonstrateFromJson() {
String json = "[\"Android\",\"iOS\",\"Flutter\",\"React Native\"]";
Gson gson = new Gson();
Type listType = new TypeToken>(){}.getType();
List list = gson.fromJson(json, listType);
appendResult("\n=== JSON → ArrayList ===");
appendResult("JSON: " + json);
appendResult("Parsed: " + list);
// ใช้งาน: list.get(0) → "Android"
}
private void appendResult(String text) {
tvResult.append(text + "\n");
}
}
แปลง Object Complex (ไม่ใช่แค่ String)
// Model Class
public class Student {
String name;
int age;
List subjects;
boolean isActive;
// Constructor, Getters, Setters...
}
// ใช้งาน
List students = Arrays.asList(
new Student("สมชาย", 20, Arrays.asList("Math", "Physics"), true),
new Student("สมหญิง", 21, Arrays.asList("Chemistry", "Biology"), false)
);
Gson gson = new Gson();
String json = gson.toJson(students);
// ผลลัพธ์: [{"name":"สมชาย","age":20,"subjects":["Math","Physics"],"isActive":true},...]
// กลับกัน
Type listType = new TypeToken>(){}.getType();
List parsed = gson.fromJson(json, listType);
การตั้งค่า Gson ขั้นสูง
Gson gson = new GsonBuilder()
.setPrettyPrinting() // JSON สวย อ่านง่าย (มี indent)
.serializeNulls() // รวม field ที่เป็น null ด้วย
.setDateFormat("yyyy-MM-dd") // รูปแบบวันที่
.excludeFieldsWithoutExposeAnnotation() // ใช้ @Expose ควบคุม field
.create();
ตัวเลือก JSON Library อื่นๆ
| Library | ข้อดี | เหมาะสำหรับ |
|---|---|---|
| Gson | ง่าย เร็ว รองรับ Kotlin | ทั่วไป, Android |
| Moshi (Square) | ปลอดภัยกว่า Kotlin, Kotlin-first | Kotlin projects |
| Kotlinx.Serialization | Official Kotlin, Multiplatform, Compile-time | Kotlin Multiplatform |
| Jackson | Feature-rich, Streaming API | Enterprise, Complex cases |
สรุป
gson.toJson(list)→ ArrayList/List → JSON Stringgson.fromJson(json, type)→ JSON String → ArrayList/List (ต้องใช้ TypeToken)- Gson จัดการ Generic Type ได้ดี เหมาะกับ Kotlin/Java
- สำหรับโปรเจกต์ใหม่ ให้พิจารณา Kotlinx.Serialization หรือ Moshi ด้วย