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

Encode/Decode JSON ด้วย Base64 ใน Java: คู่มือ DatatypeConverter และ java.util.Base64

การส่งข้อมูล binary ผ่าน JSON มักใช้ Base64 Encoding Java มี 2 วิธีหลัก: javax.xml.bind.DatatypeConverter (Java 6-8) และ java.util.Base64 (Java 8+ แนะนำ)

ตัวอย่าง JSON

{
  "menu": {
    "id": "file",
    "value": "File",
    "popup": {
      "menuitem": [
        {"value": "New", "onclick": "CreateNewDoc()"},
        {"value": "Open", "onclick": "OpenDoc()"},
        {"value": "Close", "onclick": "CloseDoc()"}
      ]
    }
  }
}

วิธีที่ 1: java.util.Base64 (Java 8+ ✅ แนะนำ)

import java.util.Base64;

public class JsonBase64Example {
    public static void main(String[] args) {
        String json = "{\"menu\":{\"id\":\"file\",\"value\":\"File\"}}";
        
        // Encode
        String encoded = Base64.getEncoder().encodeToString(json.getBytes());
        System.out.println("Encoded: " + encoded);
        // eyJtZW51Ijp7ImlkIjoiZmlsZSIsInZhbHVlIjoiRmlsZSJ9fQ==
        
        // Decode
        byte[] decodedBytes = Base64.getDecoder().decode(encoded);
        String decoded = new String(decodedBytes);
        System.out.println("Decoded: " + decoded);
        // {"menu":{"id":"file","value":"File"}}
    }
}

Base64 Variants

// Standard (default)
Base64.getEncoder().encodeToString(bytes);

// URL Safe (ใช้ - และ _ แทน + และ /)
Base64.getUrlEncoder().encodeToString(bytes);

// MIME (มี line break ทุก 76 chars)
Base64.getMimeEncoder().encodeToString(bytes);

วิธีที่ 2: DatatypeConverter (Java 6-8, Deprecated Java 9+)

import javax.xml.bind.DatatypeConverter;

public class JsonBase64Legacy {
    public static void main(String[] args) {
        String json = "{\"menu\":{\"id\":\"file\"}}";
        byte[] bytes = json.getBytes();
        
        // Encode
        String encoded = DatatypeConverter.printBase64Binary(bytes);
        
        // Decode
        byte[] decoded = DatatypeConverter.parseBase64Binary(encoded);
        String result = new String(decoded);
    }
}

⚠️ หมายเหตุ: javax.xml.bind ถูกนำออกจาก JDK 11+ ต้องเพิ่ม dependency แยกถ้าอยากใช้ต่อ

ตัวอย่างเต็ม รันได้ (Java 8+)

import java.util.Base64;

public class JsonEncodeDecode {
    public static void main(String[] args) {
        String json = "{\n" +
                "  \"menu\": {\n" +
                "    \"id\": \"file\",\n" +
                "    \"value\": \"File\",\n" +
                "    \"popup\": {\n" +
                "      \"menuitem\": [\n" +
                "        {\"value\": \"New\", \"onclick\": \"CreateNewDoc()\"},\n" +
                "        {\"value\": \"Open\", \"onclick\": \"OpenDoc()\"},\n" +
                "        {\"value\": \"Close\", \"onclick\": \"CloseDoc()\"}\n" +
                "      ]\n" +
                "    }\n" +
                "  }\n" +
                "}";
        
        // Encode
        String encoded = Base64.getEncoder().encodeToString(json.getBytes());
        System.out.println("=== Encoded ===");
        System.out.println(encoded);
        
        // Decode
        byte[] decodedBytes = Base64.getDecoder().decode(encoded);
        String decoded = new String(decodedBytes);
        System.out.println("\n=== Decoded ===");
        System.out.println(decoded);
    }
}

กรณีใช้งานจริง

  • ส่ง binary data (รูปภาพ, ไฟล์) ผ่าน REST API JSON
  • เก็บข้อมูล binary ใน database text column
  • JWT Token (Header.Payload.Signature เป็น Base64Url)
  • Basic Authentication Header

บทความเกี่ยวข้อง