DevToolPal
ไทย

แปลง JSON เป็น Go Struct

สร้าง struct ของ Go พร้อมแท็ก json จากตัวอย่าง JSON รองรับ struct ซ้อนแบบตั้งชื่อหรือแบบอินไลน์ และ omitempty

ทำงานในเครื่อง ไม่มีการอัปโหลด

ตัวเลือก

ออบเจ็กต์ซ้อน

JSON

0 ตัวอักษร · 0 B

Go

0 ตัวอักษร · 0 B

เครื่องมือนี้ทำอะไร

ตัวแปลง JSON เป็น Go อ่านตัวอย่าง JSON แล้วเขียนนิยาม struct ของ Go พร้อมแท็ก json ที่ใช้กับ encoding/json ได้ทันที วางข้อมูลตอบกลับจาก API ที่คุณเรียกใช้ แล้วรับชนิดข้อมูลที่ส่งให้ json.Unmarshal ได้เลยโดยไม่ต้องเขียนทุกฟิลด์และแท็กเอง

ตัวแปลงจะตรวจดูทุกค่าในตัวอย่าง ออบเจ็กต์ซ้อนจะกลายเป็น struct ของตัวเอง สมาชิกทั้งหมดของอาร์เรย์รวมเป็นชนิดสมาชิกเดียว และฟิลด์ที่ไม่มีในบางสมาชิกหรือบางครั้งเป็น null จะถูกตรวจพบว่าไม่บังคับ ผลลัพธ์จัดแนวแบบเดียวกับที่ gofmt จัด

วิธีใช้

  1. วาง JSON ลงในช่องป้อนข้อมูล อัปโหลดไฟล์ .json หรือคลิก ตัวอย่าง
  2. ตั้งชื่อชนิดรากแล้วเลือกวิธีเขียนออบเจ็กต์ซ้อน ฟิลด์ใดจะได้ omitempty และฟิลด์ที่เป็น null ได้จะใช้พอยน์เตอร์หรือไม่
  3. คัดลอกโค้ด 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 ถูกสร้างในเบราว์เซอร์ของคุณ และไม่มีสิ่งใดถูกส่งไปยังเซิร์ฟเวอร์