JSON เป็นโครงสร้างข้อมูล Go
ให้วางตัวอย่าง JSON แล้วรับคำนิยามของสตรัคแบบ Go ซึ่งสามารถวิเคราะห์ข้อมูลได้อย่างถูกต้องโดยใช้ encoding/json โดยฟิลด์จะถูกส่งออกในรูปแบบ CamelCase พร้อมการติดแท็กด้วยคีย์ JSON เดิม เมื่อค่าอาจเป็น null จะถูกแปลงเป็นพอยน์เตอร์ และวัตถุที่อยู่ภายในกันจะได้รับการประกาศเป็นสตรัคที่มีชื่อเฉพาะตัว
วิธีแปลง JSON เป็นโครงสร้างข้อมูลของ Go
-
1
วางข้อมูลในรูปแบบ JSON
ตัวอย่างเพียงหนึ่งชุดก็เพียงพอแล้ว ส่วนการใช้หลายตัวอย่างจะช่วยยกระดับประสิทธิภาพในการอนุมานแบบสามารถตัดทอนข้อมูลได้ (nullable inference)
-
2
เลือกชื่อ
สำหรับฟิลด์ที่ส่งออกไป PascalCase เป็นมาตรฐานของภาษา Go ให้เลือกรูปแบบการย่อชื่อ (เช่น `URL` เทียบกับ `Url`, `ID` เทียบกับ `Id`)
-
3
เลือกกลยุทธ์เสริมที่ต้องการ
ใช้ตัวชี้นำสำหรับฟิลด์ที่สามารถเป็น null ได้ (ซึ่งเป็นวิธีที่เหมาะสมที่สุด) หรือแท็ก `omitempty`
-
4
คัดลอกโครงสร้าง (Structures)
โครงสร้างรากหนึ่งชุดพร้อมโครงสร้างย่อยที่ซ้อนกัน ให้วางไว้ในไฟล์ `.go` แล้วเลือก `go build`
ตัวอย่างผลลัพธ์
สำหรับ:
{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }
ผลลัพธ์:
type User struct {
FirstName string `json:"first_name"`
Age int `json:"age"`
Email *string `json:"email"`
Tags []string `json:"tags"`
}
การจับคู่รูปแบบ
| ค่า JSON | ประเภทของ Go |
|---|---|
| ข้อความ | string |
| จำนวนเต็ม | int หรือ int64 |
| หมายเลข (ฐานสิบ) | float64 |
| บูลีน | bool |
| null (เมื่อมีพี่น้องที่ไม่ใช่ค่า null) | *T (ตัวชี้) |
| ชุดข้อมูล | []T |
| วัตถุ | โครงสร้างที่มีชื่อ |
| ชุดข้อมูลผสม | []interface{} |
การตั้งชื่อสำนวนที่เครื่องสร้างจะใช้
- ตัวย่อต้องเขียนเป็นตัวพิมพ์ใหญ่:
id→ID,url→URL,api_key→APIKeyซึ่งสอดคล้องกับรูปแบบที่ Go แนะนำ (รวมถึงกฎสำหรับgo vetและstaticcheck) - ฟิลด์จาก JSON ในรูปแบบ Snake Case เป็นรูปแบบ Pascal Case:
first_name→FirstName - คำย่อแบบคำเดียวถูกคงไว้ตามเดิม:
IPยังคงเป็นIPและHTTPยังคงเป็นHTTP - แท็ก JSON:
json:"first_name"ยังคงใช้คีย์เดิม ทำให้กระบวนการเข้ารหัสและถอดรหัสมีความโปร่งใสและเป็นระบบ
ฟิลด์ที่สามารถเลือกได้: เป็นพอยน์เตอร์ หรือ omitempty?
| กลยุทธ์ | ใช้เมื่อ |
|---|---|
ตัวชี้ (*T) |
คุณต้องแยกแยะระหว่าง “ไม่มี” กับ “ค่าเป็นศูนย์” |
omitempty |
คุณต้องการข้ามค่าศูนย์เท่านั้นในกระบวนการแปลงข้อมูล (marshalling) ส่วนการถอดแปลงข้อมูล (unmarshalling) จะเก็บค่าศูนย์แทนกรณีที่ไม่มีข้อมูล |
| ไม่มี | ฟิลด์นี้มีอยู่เสมอ และค่าเป็นศูนย์มีความหมาย |
เครื่องกำเนิดจะใช้ค่าเริ่มต้นเป็น pointer + omitempty สำหรับข้อมูลที่ถูกจัดว่าเป็น null โดยสามารถปรับแต่งค่าได้ตามความหมายเฉพาะของคุณ
ข้อผิดพลาดที่พบบ่อย
- เมื่อค่าจำนวนเต็มใน JSON เกินขีดจำกัดของ
MaxInt32บนระบบเป้าหมายแบบ 32 บิต ให้ใช้int; ส่วนค่าที่มีขนาดใหญ่เป็นที่ทราบแล้ว ให้ใช้int64 - การเรียงลำดับคีย์กลับไปและสูญเสียลำดับสำคัญ:
encoding/jsonจะปล่อยคีย์ตามลำดับที่ระบุในฟิลด์ ไม่ใช่ลำดับ JSON เดิม หากต้องการผลลัพธ์ที่ถูกต้องตามมาตรฐาน ควรจัดเรียงคีย์ด้วยตนเอง - อาร์เรย์ที่มีรูปแบบผสม:
[]interface{}สูญเสียความปลอดภัยของประเภทข้อมูล ควรพิจารณาใช้ประเภทข้อมูลแบบยูนียน (union type) โดยแทนด้วยฟิลด์ตัวระบุชนิดtype - การละเว้นการใช้
omitemptyในฟิลด์แบบเลือก หากไม่ใช้omitemptyฟิลด์แบบเลือกจะถูกแปลงเป็น"foo": nullแทนที่จะถูกละเว้นไปโดยตรง
คำถามที่พบบ่อย
ควรใช้ตัวชี้ (pointer) เมื่อจำเป็นต้องแยกแยะระหว่างกรณีที่ “ฟิลด์ไม่มีค่า” กับกรณีที่ “ฟิลด์มีค่าเป็นศูนย์” สำหรับค่าศูนย์ที่ไม่ใช่ค่าทางธุรกิจที่ถูกต้อง ให้ใช้ omitempty (โดย "", 0 และ false มีความหมายเสมอว่า “ข้ามส่วนนี้”) ทีมงานจำนวนมากจะเลือกใช้ตัวชี้หนึ่งตัวและประยุกต์ใช้อย่างสม่ำเสมอทั่วทั้งฐานโค้ด
ออบเจกต์แต่ละตัวที่ถูกฝังอยู่จะกลายเป็นการประกาศสตรัคท์ที่มีชื่อเฉพาะต่างหาก (เช่น User → Address) โดยประเภทข้อมูลจะถูกรวมไว้ในโค้ดโดยตรงเฉพาะเมื่อสตรัคท์ที่ฝังอยู่มีขนาดเล็กและใช้งานเพียงครั้งเดียวเท่านั้น หากไม่ใช่กรณีนี้ จะได้ประเภทข้อมูลที่เรียบง่ายและสามารถนำกลับมาใช้ซ้ำได้
ใช่ รหัส id จะเปลี่ยนเป็น ID, url เป็น URL และ api_key เป็น APIKey ซึ่งเป็นสิ่งที่ go vet กำหนดไว้ และเป็นสิ่งที่คู่มือรูปแบบการเขียนโปรแกรม Go ส่วนใหญ่แนะนำด้วย
เครื่องกำเนิดจะสร้างโครงสร้างข้อมูลแบบธรรมดาพร้อมแท็กมาตรฐาน json: หากต้องการใช้รูปแบบ UnmarshalJSON ที่ปรับแต่งเฉพาะ (เช่น สำหรับวันที่ในรูปแบบที่ไม่ใช่ ISO) ให้เพิ่มแท็กเหล่านั้นเข้าไปด้วยตนเองหลังจากกระบวนการสร้างเสร็จสิ้น
เครื่องมือที่เกี่ยวข้อง
ตารางอ้างอิง ASCII
ตาราง ASCII ครบตั้งแต่ 0 ถึง 127 พร้อมค่าเลขฐานสิบ ฐานสิบหก ฐานแปด ฐานสอง และรูปแบบการอ้างอิงอักขระแบบตัวเลขของ HTML รวม NUL, LF และ DEL
อ้างอิงตัวอักษร HTML
รายการที่สามารถค้นหาได้ขององค์ประกอบ HTML พร้อมรหัสชื่อและรหัสตัวเลข รวมถึงฟังก์ชันสำเนาด้วยคลิกเดียวสำหรับตัวอักษรพิเศษและสัญลักษณ์ต่างๆ
ตารางอ้างอิงแป้นพิมพ์ลัด
ค้นหาแป้นพิมพ์ลัดเริ่มต้นตามเอกสารของ VS Code, Chrome และ Bash ที่ใช้ GNU Readline บน macOS, Windows และ Linux
ตัวตรวจสอบอีเมล
ตรวจสอบที่อยู่อีเมล: ตรวจไวยากรณ์ RFC 5322 ค้นหา MX เรกคอร์ดแบบเรียลไทม์ พร้อมรายละเอียดส่วนท้องถิ่น โดเมน และความยาว ไม่มีการส่งอีเมลใด ๆ
ตัวลดรูปพีชคณิตบูลีน
ประเมินนิพจน์บูลีนสำหรับทุกชุดอินพุตและดูตารางค่าความจริงที่สมบูรณ์ รองรับตัวแปรสูงสุดห้าตัวและตัวดำเนินการ &, |, !, ^
เครื่องมือสร้าง EditorConfig
สร้างไฟล์ .editorconfig ด้วยกฎสไตล์และขนาดการเยื้อง การจบบรรทัด ชุดอักขระ และช่องว่างของคุณ เพื่อให้การจัดรูปแบบสอดคล้องกันในทุก IDE และโปรแกรมแก้ไข
เครื่องมือนี้มีให้บริการในภาษาอื่น
- JSON ke Struktur Go [ID]
- JSON→Go構造体 [JA]
- JSON thành cấu trúc [VI]
- JSON zu Go Struct [DE]
- JSON을 Go 구조체로 변환 [KO]
- JSON na strukturę Go [PL]
- JSON para Estrutura Go [PT]
- JSON a Estructura Go [ES]
- JSON till Go-struktur [SV]
- JSON إلى بنية Go [AR]
- JSON vers Go Struct [FR]
- JSON naar Go-structuur [NL]
- JSON в структуру данных [RU]
- JSON'dan Go Yapısına [TR]
- JSON 至Go结构 [ZH]
- JSON to Go Struct [EN]
- JSON in Struttura Go [IT]