JSON เป็นโครงสร้างข้อมูล Go

ถัดไป

ให้วางตัวอย่าง JSON แล้วรับคำนิยามของสตรัคแบบ Go ซึ่งสามารถวิเคราะห์ข้อมูลได้อย่างถูกต้องโดยใช้ encoding/json โดยฟิลด์จะถูกส่งออกในรูปแบบ CamelCase พร้อมการติดแท็กด้วยคีย์ JSON เดิม เมื่อค่าอาจเป็น null จะถูกแปลงเป็นพอยน์เตอร์ และวัตถุที่อยู่ภายในกันจะได้รับการประกาศเป็นสตรัคที่มีชื่อเฉพาะตัว

วิธีแปลง JSON เป็นโครงสร้างข้อมูลของ Go

  1. 1

    วางข้อมูลในรูปแบบ JSON

    ตัวอย่างเพียงหนึ่งชุดก็เพียงพอแล้ว ส่วนการใช้หลายตัวอย่างจะช่วยยกระดับประสิทธิภาพในการอนุมานแบบสามารถตัดทอนข้อมูลได้ (nullable inference)

  2. 2

    เลือกชื่อ

    สำหรับฟิลด์ที่ส่งออกไป PascalCase เป็นมาตรฐานของภาษา Go ให้เลือกรูปแบบการย่อชื่อ (เช่น `URL` เทียบกับ `Url`, `ID` เทียบกับ `Id`)

  3. 3

    เลือกกลยุทธ์เสริมที่ต้องการ

    ใช้ตัวชี้นำสำหรับฟิลด์ที่สามารถเป็น null ได้ (ซึ่งเป็นวิธีที่เหมาะสมที่สุด) หรือแท็ก `omitempty`

  4. 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{}

การตั้งชื่อสำนวนที่เครื่องสร้างจะใช้

  • ตัวย่อต้องเขียนเป็นตัวพิมพ์ใหญ่: idID, urlURL, api_keyAPIKey ซึ่งสอดคล้องกับรูปแบบที่ Go แนะนำ (รวมถึงกฎสำหรับ go vet และ staticcheck)
  • ฟิลด์จาก JSON ในรูปแบบ Snake Case เป็นรูปแบบ Pascal Case: first_nameFirstName
  • คำย่อแบบคำเดียวถูกคงไว้ตามเดิม: 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 มีความหมายเสมอว่า “ข้ามส่วนนี้”) ทีมงานจำนวนมากจะเลือกใช้ตัวชี้หนึ่งตัวและประยุกต์ใช้อย่างสม่ำเสมอทั่วทั้งฐานโค้ด

ออบเจกต์แต่ละตัวที่ถูกฝังอยู่จะกลายเป็นการประกาศสตรัคท์ที่มีชื่อเฉพาะต่างหาก (เช่น UserAddress) โดยประเภทข้อมูลจะถูกรวมไว้ในโค้ดโดยตรงเฉพาะเมื่อสตรัคท์ที่ฝังอยู่มีขนาดเล็กและใช้งานเพียงครั้งเดียวเท่านั้น หากไม่ใช่กรณีนี้ จะได้ประเภทข้อมูลที่เรียบง่ายและสามารถนำกลับมาใช้ซ้ำได้

ใช่ รหัส 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 และโปรแกรมแก้ไข

เครื่องมือนี้มีให้บริการในภาษาอื่น