แปลง JSON เป็น Go Struct: สร้าง Go Types แบบ Idiomatic ได้ทันที
คู่มือแปลง JSON payload เป็น Go struct ที่สะอาดและ idiomatic พร้อม json tags, omitempty และ nested struct inference — ฟรี ใช้งาน 100% client-side
Table of Contents
ใครเคย integrate API ของ third party ใน Go คงคุ้นเคยกับ scenario นี้ดี: documentation ให้ sample JSON response มา แล้วเราต้องนั่งเขียน struct ให้ตรงกับมันทีละ field ทีละ tag — เปลืองเวลาเป็นสิบนาที แถมพิมพ์ tag ผิดแค่ตัวเดียวก็กลายเป็น bug เงียบๆ ที่เจอตอน runtime ว่าค่ามันเป็น zero value โดยไม่รู้ตัว
JSON to Go Struct Converter ตัดปัญหานี้ทิ้งไปเลย แค่วาง JSON payload ใดๆ ลงไป ก็จะได้ Go struct ที่สะอาดและ idiomatic ทันที — field เป็น PascalCase แบบ exported, type ถูก infer อัตโนมัติ, column ตรงแนวสวยงาม และมี json struct tags ครบพร้อมใช้กับ encoding/json ทั้งหมดนี้ทำงานใน browser ของคุณล้วนๆ ข้อมูล API response, config file หรือข้อมูลลูกค้าจึงไม่มีทางรั่วออกนอกเครื่อง
ในบทความนี้เราจะพาไปดูว่า converter ทำงานยังไง, infer Go types จาก JSON values อย่างไร และ use cases จริงที่มันช่วยประหยัดเวลาได้มากที่สุด — ตั้งแต่ API client models ไปจนถึง webhook payloads
ทำไมต้องใช้ JSON to Go Struct Converter?
- Type inference ทันที. String กลายเป็น string, integer กลายเป็น int, ทศนิยมกลายเป็น float64, boolean กลายเป็น bool และ null ตกไปเป็น interface{} อย่างปลอดภัย — ไม่ต้องนั่ง map JSON types ไป Go types เองอีกต่อไป
- ชื่อ field แบบ idiomatic. เครื่องมือแปลง key แบบ snake_case, kebab-case, camelCase และแม้กระทั่ง key ที่คั่นด้วย space ให้เป็นชื่อ PascalCase แบบ exported — user_name กลายเป็น UserName, isActive กลายเป็น IsActive — โดยยังเก็บ key เดิมไว้ใน json tag เพื่อให้ unmarshal ทำงานถูกต้องเป๊ะ
- Nested struct inference ในตัว. JSON object ที่ซ้อนกันกลายเป็น inline anonymous structs และ array กลายเป็น []T ตาม element ตัวแรก — payload ที่ซ้อนลึกกี่ชั้นก็จัดการให้อัตโนมัติ
- รองรับ omitempty แบบ optional. สลับ toggle เดียวก็เพิ่ม ,omitempty ให้ทุก tag เพื่อให้ field ที่เป็น zero value ถูกข้ามตอน marshal กลับเป็น JSON — สิ่งที่ PATCH requests และ API responses ต้องการกันบ่อยมาก
- Output สะอาด ตรงแนว. ชื่อ field และ type ถูก align เป็น column แบบที่ทีมที่รัก gofmt คาดหวัง โค้ดที่ได้เหมือนเขียนมือ ไม่ใช่ของเถื่อนจากเครื่อง
- 100% client-side และฟรี. การแปลงทำใน browser ล้วนๆ (จำกัด input 1MB) ไม่ต้องสมัคร ไม่มี server round-trip ไม่มี data leakage — สำคัญมากเมื่อคุณวาง internal API responses หรือ production payloads
ฟีเจอร์เด่น
| ฟีเจอร์ | ทำอะไร |
|---|---|
| Type inference | Map JSON values เป็น Go types: string, int, float64, bool, interface{} |
| Smart field naming | key แบบ snake_case / kebab-case / camelCase → field PascalCase แบบ exported |
| json tags | สร้าง tag json:"original_key" อัตโนมัติ |
| omitempty toggle | เพิ่ม ,omitempty ให้ทุก tag แบบ optional |
| Nested struct inference | object ที่ซ้อนกัน → inline anonymous structs |
| การจัดการ array | []T จาก element แรก; array ปนหลาย type หรือว่าง → []interface{} |
| Field alignment | ชื่อและ type เรียงเป็น column อ่านง่าย |
| ตั้งชื่อ root เองได้ | ตั้งชื่อ root struct ตามที่ codebase ต้องการ |
| ประมวลผล client-side | ทุกอย่างทำใน browser — ไม่มีการ upload |
บางอย่างในนี้สมควรได้พูดถึงเพิ่ม ตรรกะ smart naming จะ split key ด้วย _, - และ space แล้วยังตรวจจับ boundary ของ camelCase ภายในด้วย — ดังนั้น first_name, firstName และ first name ล้วนให้ผลลัพธ์ FirstName ถูกต้องเหมือนกัน โดย key เดิมจะถูกเก็บไว้ใน struct tag เสมอ ซึ่งก็คือสิ่งที่ทำให้ json.Unmarshal ทำงานกับ payload จริงได้
ตรรกะ array ก็ pragmatic ไม่แพ้กัน: array ที่ type เดียวกันอย่าง ["a", "b"] กลายเป็น []string แต่ array ปน type อย่าง [1, "two"] หรือ array เปล่า [] จะกลายเป็น []interface{} แทนที่จะเดาผิด — คุณได้ struct ที่ compile และ unmarshal ถูกต้องตั้งแต่ครั้งแรก
วิธีใช้งาน
- วาง JSON ของคุณลงใน input panel — เป็น top-level object, array หรือแม้แต่ primitive เปล่าๆ ก็ได้ converter รองรับครบ
- ตั้งชื่อ root struct (เช่น User, OrderResponse, WebhookPayload) ซึ่งจะกลายเป็นชื่อใน declaration type X struct
- เปิด/ปิด omitempty ถ้าคุณวางแผนจะ marshal struct กลับเป็น JSON และอยากให้ข้าม field ที่เป็น zero value
- กด convert — Go struct จะปรากฏใน output panel ทันทีพร้อม field ที่ align และ json tags ครบ
- Copy ผลลัพธ์ ไปวางในไฟล์ .go แล้วรัน gofmt / tooling ปกติของทีม — จบ ไม่ต้องแปลงทีละ field ด้วยมืออีก
เข้าใจ Go Struct Tags และ Type Inference
package encoding/json ของ Go จับคู่ struct field กับ JSON key ผ่าน struct tags ถ้า JSON ใช้ user_name แต่ field ของคุณชื่อ UserName tag json:"user_name" ก็คือสะพานเชื่อมทั้งสอง การเขียน tags พวกนี้ด้วยมือคือจุดที่ copy-paste errors ชอบแฝงตัวมา — tag หายไปหมายความว่า field นั้นจะ unmarshal เป็น zero value แบบเงียบๆ
นี่คือ type mapping ที่ converter ใช้:
| JSON value | Go type |
|---|---|
| "hello" | string |
| 42 | int |
| 3.14 | float64 |
| true / false | bool |
| null | interface{} |
| {...} (object ซ้อน) | inline anonymous struct |
| [...] type เดียวกัน | []T (type ของ element แรก) |
| [...] ปนหลาย type หรือเปล่า | []interface{} |
ลองดูตัวอย่าง สมมติมี JSON นี้:
{
"user_id": 1001,
"userName": "aphichat",
"is_active": true,
"score": 91.5,
"roles": ["admin", "editor"],
"profile": {
"display_name": "Aphichat",
"avatar_url": null
}
}
converter จะสร้าง:
type Root struct {
UserID int `json:"user_id"`
UserName string `json:"userName"`
IsActive bool `json:"is_active"`
Score float64 `json:"score"`
Roles []string `json:"roles"`
Profile struct {
DisplayName string `json:"display_name"`
AvatarURL interface{} `json:"avatar_url"`
} `json:"profile"`
}
สังเกตว่า user_id → UserID และ userName → UserName ยังเก็บ key เดิมไว้ใน tags, object profile ที่ซ้อนกันกลายเป็น inline struct และ null ถูก map เป็น interface{} เพื่อให้ compile และ unmarshal ได้โดยไม่มีปัญหา
ส่วน option omitempty น่าจะได้รู้จักให้ลึกขึ้น ตอน marshal struct กลับเป็น JSON, encoding/json ปกติจะ emit ทุก field — รวมถึง zero values อย่าง 0, "", false และ nil การเพิ่ม ,omitempty ใน tag คือการบอก encoder ให้ข้าม field นั้นเมื่อมีค่าเป็น zero value ซึ่งสำคัญกับ API clients ที่สร้าง PATCH requests (ส่งเฉพาะสิ่งที่เปลี่ยน) และ response models ที่ field ว่างๆ เป็นแค่สิ่งรบกวน แค่ toggle เดียวในเครื่องมือก็ apply ให้ทุก field ที่ generate ออกมา
Use Cases ในทางปฏิบัติ
API Client Models
คุณกำลัง integrate กับ payment API และ docs แสดง response sample ที่มี 40 fields วางมันเข้า JSON to Go Struct Converter ตั้งชื่อ struct เป็น PaymentResponse แล้วคุณจะได้ model ครบถ้วนพร้อม tags ถูกต้องในไม่กี่วินาที ทุก field ที่โค้ดต้องใช้อยู่ครบ และถ้า API เพิ่ม field ใหม่ภายหลังก็ regenerate ได้ง่ายๆ
Config Files
Go services มักอ่าน configuration จาก JSON แทนที่จะนั่งเขียน struct Config เองแล้วภาวนาให้มันตรงกับไฟล์ ให้วาง production config sample ของคุณ generate struct ออกมา — และเพราะเครื่องมือเป็น client-side โครงสร้าง config จริงแม้จะเป็นของ internal ก็ไม่มีทางออกนอก browser ไปได้ (แนะนำให้ลบ secrets ออกจาก sample ก่อนเสมอ)
Third-Party Webhook Payloads
Webhooks จาก Stripe, GitHub หรือ messaging platforms ส่ง JSON ที่ซ้อนลึกและเปลี่ยนแปลงเรื่อยๆ ลอง generate struct จาก payload ที่ capture ได้ แล้วคุณจะเห็นโครงสร้างเต็มรูปแบบทันที — object ที่ซ้อนกัน, arrays, nullable fields — เป็น type ที่ compile ได้เอาไปใช้กับ json.Unmarshal ใน handler ของคุณได้เลย
Database and Document Mapping
หลายทีมเก็บ JSON documents ใน PostgreSQL jsonb หรือ MongoDB แล้ว decode เป็น Go types ที่ขอบของระบบ วาง document ตัวอย่าง generate struct แล้วใช้เป็น scan target — array ที่ปนหลาย type จะลดรูปเป็น []interface{} อย่างสง่างามแทนที่จะทำให้ build พัง
Best Practices
- ใช้ payload จริง ไม่ใช่ฉบับในฝัน. Generate จาก API response จริง (หรือหลายๆ ตัว) เพื่อจับ nullable fields และ mixed arrays ที่ docs เขียนมือมักพลาด
- ระวัง fields ที่เป็น null. Field ที่เป็น null ใน sample จะกลายเป็น interface{} — ถ้า API ส่ง string มาตรงนั้นด้วย ให้เปลี่ยนเป็น string หรือใช้ pointer type อย่าง *string สำหรับ optional fields
- ตั้งชื่อ inline structs เมื่อซ้อนลึก. สำหรับ payload ที่มี sub-objects ซ้ำๆ ให้ extract inline struct ออกมาเป็น named type — models จะอ่านง่ายและ reuse ได้
- เปิด omitempty อย่างเลือกที่. เหมาะกับ outbound requests แต่กับ inbound decoding ไม่มีผล — apply เฉพาะที่การ marshal มีผลจริง
- Regenerate เมื่อ API เปลี่ยน. Converter ฟรีและทันใจ การ regenerate model หลัง API version bump ถูกกว่าการ debug bug แบบ silent zero-value มาก
- รัน gofmt และ go vet หลังวางโค้ด. Output ถูก align มาให้แล้ว แต่ tooling ของ project ควรได้คำสุดท้ายเสมอ
เริ่มแปลง JSON เป็น Go วันนี้
เลิกนั่งแปลง JSON payloads เป็น Go structs ด้วยมือกันเถอะ JSON to Go Struct Converter เปลี่ยน JSON sample ใดๆ ให้เป็น Go type แบบ idiomatic พร้อม tags ครบในไม่ถึงวินาที — รวม nested structs, omitempty เป็น option และประมวลผลในเครื่องของคุณล้วนๆ ลองวาง payload แรกของคุณดูสิ แล้วจะรู้ว่ามันต่างกันแค่ไหน
เครื่องมือที่เกี่ยวข้อง:
- JSON to TypeScript Converter — สร้าง TypeScript interfaces จาก payload เดียวกันสำหรับ frontend
- JSON to C# Converter — สร้าง C# classes สำหรับ .NET API clients
- JSON to Kotlin Converter — สร้าง Kotlin data classes สำหรับโปรเจกต์ Android หรือ JVM
ขอให้สนุกกับการเขียน Go!