เครื่องมือนี้ทำอะไร
ตัวแปลง JSON เป็น Go อ่านตัวอย่าง JSON แล้วเขียนนิยาม struct ของ Go พร้อมแท็ก json ที่ใช้กับ encoding/json ได้ทันที วางข้อมูลตอบกลับจาก API ที่คุณเรียกใช้ แล้วรับชนิดข้อมูลที่ส่งให้ json.Unmarshal ได้เลยโดยไม่ต้องเขียนทุกฟิลด์และแท็กเอง
ตัวแปลงจะตรวจดูทุกค่าในตัวอย่าง ออบเจ็กต์ซ้อนจะกลายเป็น struct ของตัวเอง สมาชิกทั้งหมดของอาร์เรย์รวมเป็นชนิดสมาชิกเดียว และฟิลด์ที่ไม่มีในบางสมาชิกหรือบางครั้งเป็น null จะถูกตรวจพบว่าไม่บังคับ ผลลัพธ์จัดแนวแบบเดียวกับที่ gofmt จัด
วิธีใช้
- วาง JSON ลงในช่องป้อนข้อมูล อัปโหลดไฟล์
.jsonหรือคลิก ตัวอย่าง - ตั้งชื่อชนิดรากแล้วเลือกวิธีเขียนออบเจ็กต์ซ้อน ฟิลด์ใดจะได้
omitemptyและฟิลด์ที่เป็น null ได้จะใช้พอยน์เตอร์หรือไม่ - คัดลอกโค้ด Go หรือดาวน์โหลดเป็นไฟล์
.goแล้วเพิ่มบรรทัดpackageของคุณ
JSON ที่ไม่ถูกต้องจะแจ้งบรรทัดและคอลัมน์ที่มีปัญหา
ตัวอย่าง
JSON นี้:
{ "id": 7, "user_name": "ada", "tags": ["admin"], "profile": { "avatar_url": "https://example.com/a.png" } }
จะกลายเป็น struct เหล่านี้:
type Root struct {
ID int `json:"id"`
UserName string `json:"user_name"`
Tags []string `json:"tags"`
Profile Profile `json:"profile"`
}
type Profile struct {
AvatarURL string `json:"avatar_url"`
}
เคล็ดลับ
- ตัวอย่างเดียวแสดงได้เฉพาะสิ่งที่มีอยู่ในนั้น หากค่าอาจเป็นตัวเลขหรือสตริง ให้ใส่ทั้งสองแบบ หรือนำหลายตัวอย่างใส่ในอาร์เรย์เพื่อให้รวมกัน
- เวลาประทับจะมาในรูปสตริง เปลี่ยนชนิดเป็น
time.Timeเองเมื่อรูปแบบเป็น RFC 3339 - ออบเจ็กต์ที่มีฟิลด์เหมือนกันทุกประการจะใช้ struct ร่วมกัน ผลลัพธ์จึงสั้นเมื่อโครงสร้างเดียวกันปรากฏหลายที่
- เขียน TypeScript ด้วยหรือไม่? ตัวสร้าง JSON เป็น TypeScript ใช้การอนุมานแบบเดียวกันเพื่อสร้าง interface
คำถามที่พบบ่อย
› ชื่อฟิลด์ถูกตั้งอย่างไร?
คีย์ JSON แต่ละตัวจะถูกแปลงเป็นชื่อ Go ที่ส่งออกได้ในรูป PascalCase โดยตัวย่อที่พบบ่อยจะเขียนเป็นตัวพิมพ์ใหญ่ตามที่ golint ต้องการ ดังนั้น user_id จะเป็น UserID และ avatar_url จะเป็น AvatarURL คีย์เดิมยังเก็บไว้ในแท็ก json ทำให้ encoding/json จับคู่ฟิลด์ได้ตรงกัน
› ใช้ชนิดข้อมูล Go แบบใดบ้าง?
สตริงเป็น string จำนวนเต็มเป็น int (หรือ int64 เมื่อมีค่าที่เกิน 32 บิต) ทศนิยมเป็น float64 และค่าตรรกะเป็น bool อาร์เรย์เป็น slice ออบเจ็กต์ว่างเป็น map[string]any ส่วนค่าที่เป็น null อย่างเดียวหรือปนหลายชนิดจะเป็น any
› struct แบบตั้งชื่อกับแบบอินไลน์ต่างกันอย่างไร?
โหมดตั้งชื่อจะเขียนออบเจ็กต์ซ้อนแต่ละตัวเป็นชนิดแยก เช่น Address หรือ Order ทำให้นำกลับมาใช้และทดสอบได้ง่าย โหมดอินไลน์จะใส่ชนิด struct ไม่มีชื่อไว้ในตัวแม่โดยตรงและรวมทุกอย่างไว้ในการประกาศเดียว แบบที่ตัวแปลงด่วนหลายตัวใช้
› omitempty ถูกเพิ่มเมื่อใด?
ตามค่าเริ่มต้นจะเพิ่มเฉพาะฟิลด์ไม่บังคับ คือฟิลด์ที่ไม่มีในออบเจ็กต์บางตัวของอาร์เรย์หรือบางครั้งเป็น null คุณเลือกเพิ่มให้ทุกฟิลด์หรือไม่เพิ่มเลยก็ได้ เปิดพอยน์เตอร์เพื่อแยกค่าที่หายไปหรือ null ออกจากค่าศูนย์
› JSON ของฉันถูกอัปโหลดหรือไม่?
ไม่ struct ถูกสร้างในเบราว์เซอร์ของคุณ และไม่มีสิ่งใดถูกส่งไปยังเซิร์ฟเวอร์