Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีแปลง ArrayList เป็น String ด้วย GSON บน Android

ภาพรวม

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-firstKotlin projects
Kotlinx.SerializationOfficial Kotlin, Multiplatform, Compile-timeKotlin Multiplatform
JacksonFeature-rich, Streaming APIEnterprise, Complex cases

สรุป

  • gson.toJson(list) → ArrayList/List → JSON String
  • gson.fromJson(json, type) → JSON String → ArrayList/List (ต้องใช้ TypeToken)
  • Gson จัดการ Generic Type ได้ดี เหมาะกับ Kotlin/Java
  • สำหรับโปรเจกต์ใหม่ ให้พิจารณา Kotlinx.Serialization หรือ Moshi ด้วย