在不載入到記憶體的情況下以JSON 形式編組大數據流
經常需要將大數據流編碼為JSON,但是載入整個資料流立即流入記憶體可能是不切實際的。本文探討了在不使用內建 json.Marshaler 介面的情況下克服這項挑戰的方法。
使用json.Encoder 進行編碼:限制
嘗試對大型流進行編碼使用json.Encoder 處理資料將失敗,因為它無法處理記憶體中的通道( chan 字串)。
自訂 JSON編碼
在沒有合適的內建解決方案的情況下,自訂 JSON 編碼就變得必要。這涉及手動建立 JSON 字串,如下面的程式碼片段所示:
w := os.Stdout w.WriteString(`{ "Foo": "` t.Foo `", "Bar": [`) for x := range t.Bar { _ = json.NewEncoder(w).Encode(x) w.WriteString(`,`) } w.WriteString(`]}`)
擴展encoding/json以支持通道
擴展encoding/json以支持通道
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(']')要增強encoding/json包的通道支持,可以修改reflectValueQuoted函數位於encoding /json/encode.go中。具體來說,為通道添加類似於以下內容的案例:
casereflect.Chan: e.WriteByte('[') 我:= 0 為了 { x, 好的 := v.Recv() 如果!好的{ 休息 } 如果我 > 0 { e.WriteByte(',') } e.reflectValue(x) 我 } e.WriteByte(']')
結論
雖然encoding/json套件目前不支援通道編碼,但本文提供了編組大型資料流的替代方法高效地使用JSON 格式。自訂編碼允許將資料直接串流傳輸到 JSON 輸出,而擴充encoding/json 則提供更強大的解決方案。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3