使用MarshalJSON 編碼大數據流而不加載內存中的所有對象
想要使用json.Encoder 編碼大數據流而不加載一次將所有內容全部存入內存是一個常見問題。不幸的是,encoding/json包不提供對此的直接支援。
當前解決方法
正如您所提到的,當前的解決方案是手動建立JSON字串你自己。這涉及到當資料從流中可用時,逐段編寫 JSON 結構。這是一種有效的方法,但可能很乏味且容易出錯。
建議的補丁
要改進此過程,可以修改encoding/json包。具體來說,可以修改encoding/json/encode.go 中的reflectValueQuoted 函數來處理陣列等通道。這將允許將資料從通道直接串流傳輸到 JSON 輸出。
這裡是對 ReflectValueQuoted 中的數組案例的建議更改:
case reflect.Array:
e.WriteByte('[')
n := v.Len()
for i := 0; i 0 {
e.WriteByte(',')
}
e.reflectValue(v.Index(i))
}
e.WriteByte(']')
// Add the following case for channels:
case reflect.Chan:
e.WriteByte('[')
i := 0
for {
x, ok := v.Recv()
if !ok {
break
}
if i > 0 {
e.WriteByte(',')
}
e.reflectValue(x)
i
}
e.WriteByte(']')
補丁的好處
此補丁將使對大數據流進行編碼變得更加容易,而無需將所有對象加載到內存中。它還將消除手動字串連接的需要,降低錯誤風險並提高程式碼可讀性。
結論
儘管建議的補丁不是當前補丁的一部分coding/json 包,它展示了一種潛在的改進,可以使流式JSON 數據更加高效和方便。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3