0Pricing
Go Academy · บทเรียน

การถอดรหัสการตอบกลับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การส่งคำขอ HTTP
  2. การตั้งเวลาหมดอายุและส่วนหัว
  3. การถอดรหัสการตอบกลับ JSON
  4. การจัดการข้อผิดพลาดและตรรกะการลองใหม่
← กลับไปที่ Go Academy