veilletech.fr
5 nov. Feed du jour
#10 GO Article

Go 1.27 : encoding/json/v2 est stable

Votre JSON v1 a peut-être des habitudes que v2 refusera.

Go 1.27 déclare stables encoding/json/v2 et encoding/json/jsontext. Les défauts changent : erreur sur l'UTF-8 invalide et les noms dupliqués, casse stricte des champs, slices et maps nil encodées en [] et {}. Unmarshal gagne jusqu'à 10 fois en vitesse ; l'ancien paquet reste supporté indéfiniment.

3 min de lectureintermédiairevidéo 1:24
Partager
Sommaire6 sections
  1. Ce qui se passe
  2. Ce que v1 faisait de travers
  3. Ce qui change dans v2
  4. Les chiffres, et les réserves
  5. Comment s'y prendre
  6. À retenir

Ce qui se passe

Le 4 novembre 2026, l'équipe Go annonce que encoding/json/v2 et encoding/json/jsontext sont stables et disponibles dans Go 1.27. C'est l'aboutissement de l'API expérimentale présentée l'an dernier, pour corriger encoding/json, qui a plus de quinze ans. L'ancien paquet (v1) reste soumis à la promesse de compatibilité de Go 1 : il est supporté indéfiniment, et personne n'est obligé de migrer.

Ce que v1 faisait de travers

Ce qui change dans v2

L'architecture sépare la syntaxe, dans jsontext (encodeur et décodeur en flux, sans réflexion), et le sens, dans json/v2. Les options deviennent un argument de chaque appel :

Go
out, err := json.Marshal(in, opts...)
err = json.UnmarshalRead(r, &v)   // lit directement un io.Reader
err = json.MarshalWrite(w, in)    // écrit directement dans un io.Writer

Les défauts, plus stricts :

La plupart de ces comportements se règlent par une option ou une balise pour retrouver la sémantique de v1. Les interfaces MarshalerTo et UnmarshalerFrom (méthodes MarshalJSONTo et UnmarshalJSONFrom) traitent le JSON en flux et transmettent les options le long de la pile d'appels, ce que MarshalJSON et UnmarshalJSON ne permettaient pas.

Les chiffres, et les réserves

Marshal est à parité avec v1, parfois un peu plus rapide, parfois un peu plus lent. Unmarshal est nettement plus rapide, jusqu'à 10 fois selon les bancs d'essai de l'équipe. Dans Kubernetes, passer à UnmarshalJSONFrom a accéléré d'ordres de grandeur un service qui analysait des spécifications OpenAPI de façon récursive. Mais v2 n'est pas un remplacement transparent : il y a des cas où il reste plus lent que v1, avec des améliorations annoncées pour Go 1.28. Les deux versions sont compatibles : un paquet en v2 peut marshaler un type dont l'auteur a écrit un MarshalJSON de v1.

Comment s'y prendre

  1. Essayer v2 sur vos tests de contrat, pas sur la production.
  2. Chercher ce qui repose sur la tolérance de v1 : casse des champs, nil en null, doublons, UTF-8 douteux.
  3. Migrer vos MarshalJSON et UnmarshalJSON coûteux vers MarshalJSONTo et UnmarshalJSONFrom.
  4. Lire la section « Migrating to v2 » de la documentation du paquet encoding/json.

Source : le blog Go, via Hacker News. Source en anglais.