ฉันกำลังพัฒนาไคลเอนต์ API ที่ฉันต้องการเข้ารหัส JSON payload ตามคำขอและถอดรหัสเนื้อหาของ JSON จากการตอบสนอง
ฉันอ่านซอร์สโค้ดจากหลาย ๆ ไลบรารีและจากสิ่งที่ฉันเห็นฉันมีความเป็นไปได้สองอย่างในการเข้ารหัสและถอดรหัสสตริง JSON
ใช้json.Unmarshal
ผ่านสตริงการตอบสนองทั้งหมด
data, err := ioutil.ReadAll(resp.Body)
if err == nil && data != nil {
err = json.Unmarshal(data, value)
}
หรือใช้ json.NewDecoder.Decode
err = json.NewDecoder(resp.Body).Decode(value)
ในกรณีของฉันเมื่อจัดการกับการตอบกลับ HTTP ที่ใช้งานio.Reader
ดูเหมือนว่ารุ่นที่สองจะต้องใช้รหัสน้อยลง แต่เนื่องจากฉันได้เห็นทั้งคู่ฉันสงสัยว่ามีการตั้งค่าใด ๆ ว่าฉันควรใช้โซลูชันมากกว่าที่อื่นหรือไม่
ยิ่งกว่านั้นคำตอบที่ได้รับการยอมรับจากคำถามนี้บอกว่า
โดยใช้แทน
json.Decoder
json.Unmarshal
แต่มันไม่ได้พูดถึงเหตุผล ฉันควรหลีกเลี่ยงการใช้งานจริงjson.Unmarshal
หรือ
ioutil.ReadAll
เป็นเกือบเสมอสิ่งที่ผิดจะทำอย่างไร ไม่เกี่ยวข้องกับเป้าหมายของคุณ แต่ต้องการให้คุณมีหน่วยความจำต่อเนื่องเพียงพอที่จะจัดเก็บสิ่งที่อาจลงมาในท่อแม้ว่าการตอบสนอง 20TB ครั้งสุดท้ายจะเกิดขึ้นหลังจาก}
JSON สุดท้ายของคุณ
io.LimitReader
เพื่อป้องกันไม่ให้