
Go 1.25引入新的實驗性JSON套件,包含encoding/json/v2與encoding/json/jsontext,目標試圖解決現行encoding/json套件的限制與長年爭議。兩個套件需要設定特別的建置旗標或標籤才能啟用,雖然目前仍屬於實驗階段,但已可供開發者在實際環境測試。
新版v2在行為上更符合RFC 8259標準,最明顯的差異是強制檢查輸入資料的正確性。當JSON含有無效UTF-8字元,解碼器會直接回報錯誤,而不是像舊版默默接受並可能導致資料損壞,同時,當物件出現重複成員名稱,v2會拒絕處理,避免因實作解讀方式不同而產生安全風險。
在資料結構對應方面,v2將區分大小寫列為預設行為,JSON欄位名稱需與Go struct欄位精確相符。此外,nil的slice與map在序列化時會輸出為空陣列或空物件,減少跨語言解析時,因為null而無法正確辨識成陣列或物件,讓跨系統交換資料更穩定一致。這些行為都可透過選項調整,讓開發者在新舊語意間取得平衡。
此次改版採用兩層架構,jsontext專注在語法處理,提供真正的串流編碼器與解碼器,能逐一讀寫JSON值或Token,而v2則負責語義層,提供將Go資料結構轉換成JSON(Marshal)與將JSON還原成Go資料結構(Unmarshal)的功能,並將選項納入第一級參數,讓開發者能直接控制行為。這樣的設計改善了舊版解碼器難以檢查輸入結尾雜訊的問題,也避免了必須先整批緩衝再處理的低效流程。
除了保留既有的Marshaler與Unmarshaler介面外,v2新增MarshalerTo與UnmarshalerFrom,允許型別直接利用jsontext的編碼器與解碼器實作。這種方式避免重複解析與額外配置,對於處理大型或巢狀結構的JSON特別有利。
Go團隊並未將v1與v2獨立,在啟用實驗性JSON套件時,v1會改以v2的實作為底層。開發者無需修改程式碼即可測試,當功能符合預期即可逐步過渡到v2,反之則仍可依賴既有的v1行為。
目前,v2在序列化效能上大致與v1相當,而反序列化則明顯加速,可達數倍提升。官方強調,這些API仍屬實驗性質,未來可能調整甚至不被採用,但其實作品質已足以支撐大型專案運行,呼籲開發者透過實務測試回饋意見,協助決定後續走向。
熱門新聞
2026-01-06
2026-01-06
2026-01-06
2026-01-05
2026-01-02