การถอดรหัสการตอบกลับ JSON
แยกวิเคราะห์การตอบกลับจาก API เป็นสตรักต์ของ Go
การถอดรหัสการตอบกลับ JSON เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
ตรวจสอบสถานะก่อนถอดรหัส
โปรดตรวจสอบเสมอว่าสถานะการตอบกลับเป็น 2xx ก่อนพยายามถอดรหัสเนื้อหา การตอบกลับที่ไม่ใช่ 2xx อาจมีหน้า HTML แสดงข้อผิดพลาดแทน JSON
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
body, _ := io.ReadAll(resp.Body)
return fmt.Errorf("status %d: %s", resp.StatusCode, body)
}json.NewDecoder
ถอดรหัสเนื้อหาการตอบกลับแบบสตรีมโดยไม่โหลดทั้งหมดเข้าสู่หน่วยความจำ:
var result APIResponse
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
return fmt.Errorf("decode: %w", err)
}ถอดรหัสเป็นแมปทั่วไป
สำหรับโครงสร้าง JSON ที่ไม่ทราบล่วงหน้าหรือเปลี่ยนแปลงได้ ให้ถอดรหัสเป็น map[string]any:
var m map[string]any
json.NewDecoder(resp.Body).Decode(&m)โครงสร้างซ้อนกัน
จำลอง JSON ที่ซ้อนกันด้วยโครงสร้าง Go ที่ซ้อนกันและแท็ก json:
type Repo struct {
Name string `json:"name"`
Owner struct {
Login string `json:"login"`
} `json:"owner"`
}ฟิลด์ทางเลือกด้วยพอยน์เตอร์
ใช้ชนิดพอยน์เตอร์สำหรับฟิลด์ JSON ที่เป็นทางเลือก เพื่อแยกความแตกต่างระหว่าง "ไม่มีฟิลด์" กับ "ฟิลด์มีค่าเป็นค่าศูนย์":
type Response struct {
Data *string `json:"data"`
Error *string `json:"error"`
}ถอดรหัสอาร์เรย์
ถอดรหัสอาร์เรย์ JSON เป็นสไลซ์ Go ได้โดยตรง:
var users []User
json.NewDecoder(resp.Body).Decode(&users)ตรวจสอบข้อผิดพลาดในการถอดรหัส
แยกข้อผิดพลาดทางไวยากรณ์ของ JSON ออกจากข้อผิดพลาด EOF ที่ไม่คาดคิด — EOF หมายถึงเนื้อหาว่างเปล่า (ไม่มี JSON อยู่เลย)
err := json.NewDecoder(resp.Body).Decode(&v)
if errors.Is(err, io.EOF) {
return fmt.Errorf("empty response body")
}ตรวจสอบประเภทเนื้อหา
ตรวจสอบว่าประเภทเนื้อหาของการตอบกลับเป็น application/json ก่อนถอดรหัส เพื่อป้องกันการถอด HTML เป็น JSON โดยไม่รู้ตัว
ct := resp.Header.Get("Content-Type")
if !strings.HasPrefix(ct, "application/json") {
return fmt.Errorf("unexpected content-type: %s", ct)
}ละเว้นฟิลด์ที่ไม่รู้จัก
json.Decoder จะละเว้นฟิลด์ JSON ที่ไม่มีฟิลด์ในโครงสร้างตรงกันโดยไม่แจ้งเตือน นี่เป็นพฤติกรรมเริ่มต้นและมักเหมาะสมสำหรับความเข้ากันได้กับรุ่นต่อไป
ถอดรหัสแบบเข้มงวดด้วย DisallowUnknownFields
เรียกใช้ dec.DisallowUnknownFields() เพื่อให้ส่งคืนข้อผิดพลาดเมื่อพบคีย์ที่ไม่รู้จัก ซึ่งมีประโยชน์สำหรับการแยกวิเคราะห์การกำหนดค่าแบบเข้มงวด แต่ไม่เหมาะกับการรับข้อมูลจาก API ของบุคคลที่สาม
dec := json.NewDecoder(r.Body)
dec.DisallowUnknownFields()
dec.Decode(&cfg)นำโครงสร้างที่ถอดรหัสแล้วกลับมาใช้ซ้ำ
กำหนดค่าโครงสร้างให้เป็นศูนย์ก่อนถอดรหัส หากนำกลับมาใช้กับการตอบกลับหลายรายการ เพื่อป้องกันข้อมูลค้างจากการถอดรหัสครั้งก่อน
var result APIResult
result = APIResult{} // reset
json.NewDecoder(resp.Body).Decode(&result)ตรวจสอบอย่างรวดเร็ว
เมื่อเนื้อหาการตอบกลับว่างเปล่า json.Decoder.Decode จะส่งคืนข้อผิดพลาดใด
ทบทวน: การถอดรหัสการตอบกลับ JSON
ประเด็นสำคัญ:
- ตรวจสอบรหัสสถานะก่อนถอดรหัส
- json.NewDecoder สำหรับการถอดรหัสแบบสตรีม ช่วยหลีกเลี่ยงการเก็บเนื้อหาทั้งหมดไว้ในหน่วยความจำ
- ตรวจสอบประเภทเนื้อหาว่าเป็น application/json
- io.EOF หมายถึงเนื้อหาว่างเปล่า ส่วน io.ErrUnexpectedEOF หมายถึง JSON ถูกตัดให้สั้นลง
คำถามที่พบบ่อย
บทเรียน “การถอดรหัสการตอบกลับ JSON” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การถอดรหัสการตอบกลับ JSON” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การถอดรหัสการตอบกลับ JSON”
แยกวิเคราะห์การตอบกลับจาก API เป็นสตรักต์ของ Go คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การถอดรหัสการตอบกลับ JSON” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การส่งคำขอ HTTP
- การตั้งเวลาหมดอายุและส่วนหัว
- การถอดรหัสการตอบกลับ JSON
- การจัดการข้อผิดพลาดและตรรกะการลองใหม่