ToolDeck

แปลง JSON เป็น Go Struct

สร้าง Go structs จาก JSON

ลองตัวอย่าง
ชื่อ root struct:

อินพุต JSON

เอาต์พุต Go

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ
Go structs จะแสดงที่นี่…

การแปลง JSON เป็น Go คืออะไร?

การแปลง JSON เป็น Go คือกระบวนการสร้างนิยามประเภทของ Go จากข้อมูล JSON ดิบ เพื่อให้ทำงานร่วมกับ package encoding/json ใน standard library ของ Go ได้ เนื่องจาก Go เป็นภาษาที่กำหนดประเภทอย่างชัดเจน ทุก field ใน JSON จึงต้องมี struct field ที่สอดคล้องกัน พร้อมประเภทที่ถูกต้องและ struct tag ที่บอก serializer ว่าควรแมปกับ JSON key ใด การเขียนนิยามเหล่านี้ด้วยมือสำหรับ API responses ที่ขนาดใหญ่หรือซ้อนกันหลายชั้นเป็นงานที่ช้าและเกิดข้อผิดพลาดได้ง่าย

Package encoding/json ซึ่งกำหนดไว้ใน Go specification ตั้งแต่ Go 1.0 ใช้ reflection เพื่อจับคู่ JSON keys กับ exported struct fields การจับคู่นี้ไม่คำนึงถึงตัวพิมพ์ใหญ่เล็กโดยค่าเริ่มต้น แต่การกำหนด json struct tags อย่างชัดเจนถือเป็นมาตรฐาน เพราะช่วยลดความกำกวมและทำให้ใช้แบบแผนการตั้งชื่อ PascalCase ของ Go ได้ ในขณะที่ JSON ยังคงอยู่ในรูปแบบ camelCase หรือ snake_case เครื่องมือแปลงอัตโนมัติจะอ่าน JSON ของคุณ อนุมานประเภท Go จากค่าต่าง ๆ และสร้างนิยาม struct พร้อม tags ที่ถูกต้อง

ระบบประเภทของ Go แมปกับ JSON ได้ตรงไปตรงมา ค่าสตริงกลายเป็น string บูลีนกลายเป็น bool จำนวนเต็มกลายเป็น int และจำนวนทศนิยมกลายเป็น float64 JSON objects ที่ซ้อนกันกลายเป็น structs ที่มีชื่อแยกต่างหาก และ arrays กลายเป็น slices ช่องว่างเดียวคือ null: Go ไม่มีประเภท nullable สากล ดังนั้นค่า null มักกลายเป็น pointer types (*string, *int) หรือ interface{} เครื่องมือสร้างจัดการทั้งหมดนี้ได้ภายในเสี้ยววินาที

ทำไมต้องใช้เครื่องมือแปลง JSON เป็น Go?

การกำหนด Go structs จาก JSON ด้วยมือหมายความว่าต้องนับวงเล็บปีกกา เดาประเภท และเขียน tags ใหม่ทุกครั้งที่ API เปลี่ยนแปลง เครื่องมือแปลงช่วยขจัดความยุ่งยากเหล่านั้น

สร้างประเภทได้ทันที
วาง JSON แล้วรับนิยาม Go struct ที่ถูกต้องในเวลาไม่ถึงวินาที ไม่ต้องพิมพ์ field ด้วยมือ ไม่มี tags ที่ขาดหาย ไม่มีปัญหาการจัดตำแหน่ง
🔒
ข้อมูลของคุณเป็นส่วนตัว
การแปลงทำงานทั้งหมดในเบราว์เซอร์ของคุณ JSON ไม่ออกจากเครื่องของคุณ API keys, tokens และข้อมูลผู้ใช้จึงปลอดภัย
🏷️
Struct tags ที่ถูกต้อง
ทุก field ที่สร้างขึ้นมี json struct tag ที่แมปชื่อ Go field กับ JSON key เดิม ป้องกันความไม่ตรงกันแบบเงียบในระหว่าง json.Unmarshal
📦
ไม่ต้องติดตั้งหรือสมัครสมาชิก
เปิดหน้าและวาง JSON ไม่ต้องใช้ Go toolchain ไม่มี CLI tools ที่ต้องติดตั้ง ไม่มีบัญชีที่ต้องสร้าง

กรณีใช้งาน JSON เป็น Go

การพัฒนา REST API Client
สร้าง request และ response structs สำหรับ REST APIs ของ third-party วาง JSON ตัวอย่างจากเอกสาร API และรับประเภทที่พร้อมใช้สำหรับ http.Client และ json.NewDecoder
gRPC Gateway Models
เมื่อบริการ Go เปิดรับทั้ง gRPC และ REST endpoints คุณต้องการ Go structs ที่ตรงกับ JSON payloads แปลงรูปแบบ JSON เป็น structs ที่สอดคล้องกับนิยาม protobuf ของคุณ
การแยกวิเคราะห์ค่ากำหนด DevOps
แยกวิเคราะห์ JSON config files (Terraform outputs, Kubernetes manifests, CI/CD pipeline configs) เป็น Go structs ที่มีประเภทชัดเจนสำหรับเครื่องมือที่กำหนดเองและสคริปต์อัตโนมัติ
การประมวลผล Data Pipeline
สร้าง Go structs สำหรับ JSON records จาก message queues (Kafka, RabbitMQ, SQS) หรือ data lakes Structs ที่มีประเภทชัดเจนจะตรวจจับการเปลี่ยนแปลง schema ตั้งแต่ compile time แทนที่จะรอ runtime
การตั้งค่า Test Fixture
แปลง JSON test fixtures เป็น Go structs สำหรับ table-driven tests Fixtures ที่มีความปลอดภัยด้านประเภทช่วยให้วิเคราะห์ความล้มเหลวของการทดสอบได้ง่ายกว่าการใช้ assertions แบบ map[string]interface{}
การเรียนรู้ระบบประเภทของ Go
นักศึกษาและนักพัฒนาที่มาจากภาษาที่กำหนดประเภทแบบไดนามิกสามารถวาง JSON ที่คุ้นเคยและดูว่า Go แสดงข้อมูลเดียวกันด้วยประเภทที่ชัดเจน pointers และ struct tags อย่างไร

ตารางการแมปประเภท JSON เป็น Go

Package encoding/json ปฏิบัติตามกฎเฉพาะเมื่อแมปค่า JSON กับประเภท Go ตารางด้านล่างแสดงการแมปเริ่มต้นและทางเลือกที่พบบ่อย คอลัมน์ "Default" คือสิ่งที่เครื่องมือสร้างส่วนใหญ่ผลิตออกมา คอลัมน์ "Alternative" แสดงประเภทที่คุณอาจเลือกตามความต้องการของคุณ เช่น int64 สำหรับ IDs ขนาดใหญ่ หรือ pointer types สำหรับ nullable fields

ประเภท JSONตัวอย่างDefaultAlternative
string"hello"stringstring
number (integer)42intint64
number (float)3.14float64float64
booleantrueboolbool
nullnullinterface{}*string / *int
object{"k": "v"}structstruct
array of strings["a", "b"][]string[]string
array of objects[{"id": 1}][]Item[]Item
mixed array[1, "a"][]interface{}[]interface{}

คู่มืออ้างอิง Go JSON Struct Tag

Struct tags ควบคุมวิธีที่ encoding/json ทำ serialization และ deserialization ของ fields json tag เป็น tag ที่พบบ่อยที่สุด แต่คุณสามารถรวมกับ tags อื่น ๆ (db, yaml, xml) ใน field เดียวกันได้ ไวยากรณ์ของ tag คือสตริงที่คั่นด้วย backtick หลังประเภทของ field นี่คือตัวเลือก json tag ที่ encoding/json รองรับ

Tagพฤติกรรมกรณีใช้งาน
json:"name"Maps struct field to JSON key "name"Always generated
json:"name,omitempty"Omits field from output if zero valueOptional fields
json:"-"Field is never serialized or deserializedInternal fields
json:"name,string"Encodes int/bool as JSON stringString-encoded numbers

json.Unmarshal กับ json.NewDecoder

Go มีสองวิธีในการถอดรหัส JSON ได้แก่ json.Unmarshal สำหรับ byte slices และ json.NewDecoder สำหรับ io.Reader streams ทั้งสองใช้กฎ struct tag เดียวกัน แต่แตกต่างกันในการเลือกใช้งาน

json.Unmarshal
รับ []byte และเติมข้อมูลลงใน struct เหมาะสำหรับ JSON ที่อยู่ใน memory ครบถ้วนแล้ว ไม่ว่าจะเป็น HTTP response bodies ที่อ่านด้วย io.ReadAll เนื้อหาของไฟล์ หรือ test fixtures คืนค่า error หาก JSON มีรูปแบบผิดหรือประเภทไม่ตรงกัน
json.NewDecoder
ครอบ io.Reader และถอดรหัส JSON tokens ขณะที่ข้อมูลมาถึง เหมาะสำหรับแหล่งข้อมูลแบบ streaming ได้แก่ HTTP response bodies ที่อ่านโดยตรง newline-delimited JSON (NDJSON) logs หรือไฟล์ขนาดใหญ่ที่ไม่ต้องการโหลดทั้งหมดเข้า memory เรียก Decode() ในลูปร่วมกับ More() สำหรับ streams ที่มีหลาย objects

ตัวอย่างโค้ด

ตัวอย่างเหล่านี้แสดงวิธีใช้ Go structs ที่สร้างจาก JSON ในโปรแกรมจริง รวมถึงวิธีสร้างจากภาษาอื่น ๆ ตัวอย่าง Go ใช้ encoding/json จาก standard library

Go (json.Unmarshal)
package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	ID       int      `json:"id"`
	Name     string   `json:"name"`
	Email    string   `json:"email"`
	IsActive bool     `json:"is_active"`
	Tags     []string `json:"tags"`
}

func main() {
	data := []byte(`{"id":1,"name":"Alice","email":"alice@example.com","is_active":true,"tags":["admin","editor"]}`)

	var user User
	if err := json.Unmarshal(data, &user); err != nil {
		panic(err)
	}
	fmt.Println(user.Name)  // → Alice
	fmt.Println(user.Tags)  // → [admin editor]
}
JavaScript (fetch + type reference)
// JSON response from API — this is the shape you'd convert to Go:
const res = await fetch("https://api.example.com/users/1");
const user = await res.json();
// user → { "id": 1, "name": "Alice", "email": "alice@example.com" }

// Equivalent Go struct:
// type User struct {
//     ID    int    `json:"id"`
//     Name  string `json:"name"`
//     Email string `json:"email"`
// }
Python (generate Go structs from JSON)
import json

def json_to_go(data: dict, name: str = "Root") -> str:
    lines = [f"type {name} struct {{"]
    type_map = {str: "string", int: "int", float: "float64", bool: "bool"}

    for key, value in data.items():
        go_type = type_map.get(type(value), "interface{}")
        field = key.title().replace("_", "")  # snake_case → PascalCase
        lines.append(f'\t{field} {go_type} `json:"{key}"`')
    lines.append("}")
    return "\n".join(lines)

data = json.loads('{"user_name": "Alice", "age": 30, "verified": true}')
print(json_to_go(data))
# type Root struct {
#     UserName string `json:"user_name"`
#     Age      int    `json:"age"`
#     Verified bool   `json:"verified"`
# }
Go (json.Decoder for streams)
package main

import (
	"encoding/json"
	"fmt"
	"strings"
)

type Event struct {
	Type    string `json:"type"`
	Payload string `json:"payload"`
}

func main() {
	stream := strings.NewReader(`{"type":"click","payload":"btn-1"}
{"type":"scroll","payload":"page-2"}`)

	dec := json.NewDecoder(stream)
	for dec.More() {
		var ev Event
		if err := dec.Decode(&ev); err != nil {
			break
		}
		fmt.Printf("%s: %s\n", ev.Type, ev.Payload)
	}
	// → click: btn-1
	// → scroll: page-2
}

คำถามที่พบบ่อย

json.Unmarshal กับ json.Decode ต่างกันอย่างไร?
json.Unmarshal รับ []byte ที่มีเอกสาร JSON ครบถ้วนและเติมข้อมูลลงใน struct json.NewDecoder ครอบ io.Reader และถอดรหัส JSON แบบค่อยเป็นค่อยไป ใช้ Unmarshal เมื่อคุณมี JSON ครบถ้วนใน memory แล้ว (เช่น หลัง io.ReadAll) ใช้ NewDecoder เมื่ออ่านโดยตรงจาก HTTP response body ไฟล์ หรือแหล่งข้อมูลแบบ streaming ที่ต้องการหลีกเลี่ยงการบัฟเฟอร์ payload ทั้งหมด
Go จัดการ JSON fields ที่ขาดหายจาก payload อย่างไร?
JSON fields ที่ขาดหายจะทิ้งค่า Go struct field ไว้ที่ค่าศูนย์ของมัน ได้แก่ "" สำหรับ strings, 0 สำหรับตัวเลข, false สำหรับ bools, nil สำหรับ pointers และ slices หากต้องการแยกแยะระหว่าง "field ขาดหาย" กับ "field มีอยู่แต่เป็นค่าศูนย์" ให้ใช้ pointer type เช่น *int หรือ *string pointer ที่เป็น nil หมายความว่า field ไม่มีอยู่ ส่วน pointer ที่ไม่ใช่ nil ที่มีค่าศูนย์หมายความว่าถูกกำหนดค่าเป็น 0 หรือ "" อย่างชัดเจน
ทำไม Go struct fields ต้องเป็น exported (ตัวพิมพ์ใหญ่) สำหรับ JSON?
Package encoding/json ใช้ reflection เพื่อเข้าถึง struct fields และกฎ reflection ของ Go อนุญาตให้เข้าถึงเฉพาะ exported (ตัวพิมพ์ใหญ่) fields เท่านั้น หาก field เริ่มต้นด้วยตัวพิมพ์เล็ก encoding/json จะมองไม่เห็นและจะข้ามมันอย่างเงียบ ๆ ในระหว่างทั้ง marshaling และ unmarshaling ใช้ json struct tag เพื่อแมป exported PascalCase field กับ JSON key ที่เป็นตัวพิมพ์เล็ก
จัดการ JSON keys แบบ snake_case ใน Go อย่างไร?
เพิ่ม json struct tag ที่มีชื่อ JSON key ที่แน่นอน ตัวอย่างเช่น JSON field "user_name" แมปกับ Go field UserName ที่มี tag `json:"user_name"` เครื่องมือสร้างจัดการสิ่งนี้อัตโนมัติ ไม่มีตัวเลือกสากลใน encoding/json สำหรับตั้งนโยบายการตั้งชื่อ แต่ละ field ต้องประกาศ tag ของตัวเอง
แปลง JSON ที่มีค่า null เป็น Go ได้ไหม?
ได้ ค่า JSON null แมปกับ pointer types ใน Go field เช่น "age": null จะกลายเป็น Age *int `json:"age"` เมื่อค่า JSON เป็น null Go pointer จะเป็น nil เมื่อมีค่า Go จะจัดสรร int และ pointer จะอ้างอิงไปที่มัน สำหรับ fields ที่เป็น nullable เสมอ การใช้ pointer เป็นแนวทางที่เหมาะสมใน Go
เกิดอะไรขึ้นหาก JSON มีตัวเลขที่ใหญ่เกินกว่าที่ int ของ Go จะรองรับได้?
int ของ Go ขึ้นอยู่กับ platform (32-bit บนระบบ 32-bit, 64-bit บนระบบ 64-bit) สำหรับตัวเลขขนาดใหญ่เช่น JavaScript timestamps หรือ database IDs ให้ใช้ int64 อย่างชัดเจน หาก JSON number มีจุดทศนิยมให้ใช้ float64 สำหรับตัวเลขที่เกินความแม่นยำของ float64 (เช่น ค่าทางการเงินขนาดใหญ่) ให้ใช้ json.Number ซึ่งเก็บการแสดงสตริงดิบและให้คุณแยกวิเคราะห์เองได้
เครื่องมือนี้แตกต่างจาก JSON-to-Go-Struct อย่างไร?
เครื่องมือนี้สร้างนิยามประเภท Go โดยเน้นที่รูปแบบการใช้งาน encoding/json ได้แก่ struct tags ที่ถูกต้อง การอนุมานประเภทที่เหมาะสม และการจัดการโครงสร้างและ arrays ที่ซ้อนกัน เครื่องมือ JSON to Go Struct บนไซต์นี้เน้นที่การสร้าง struct scaffolding ทั้งสองผลิต Go code ที่ถูกต้อง ใช้เครื่องมือที่เหมาะกับ workflow ของคุณ ตารางอ้างอิง struct tag และการแมปประเภทในหน้านี้มีประโยชน์ไม่ว่าจะเลือกใช้เครื่องมือสร้างใด