From c9cbeb0a1b08a9830a3d2d4abe0c2108e52f7647 Mon Sep 17 00:00:00 2001 From: Joe Tsai Date: Mon, 2 Feb 2026 17:52:37 -0800 Subject: [PATCH] encoding/json/v2: remove `unknown` tag option and DiscardUnknownMembers WARNING: This commit contains breaking changes for those already using GOEXPERIMENT=jsonv2. This removes support for the `unknown` tag option and the DiscardUnknownMembers marshal option. The `unknown` tag option semantics are a bit too subtle even for experienced Go programmers to understand. Remove support for it. The exact same feature (or something similar) can be added back into a future release of json/v2. We already support the `inline` tag option, which can handle most cases of what someone might want to do with unknown fields (such as preserve them). Fixes #77271 Updates #76444 Change-Id: I875952f0755e58aac4c571869b2cdb56e75cfda9 Reviewed-on: https://go-review.googlesource.com/c/go/+/741320 Reviewed-by: Damien Neil LUCI-TryBot-Result: Go LUCI Reviewed-by: Michael Pratt --- src/encoding/json/internal/jsonflags/flags.go | 3 +- src/encoding/json/v2/arshal_default.go | 4 +- src/encoding/json/v2/arshal_test.go | 55 +------------ src/encoding/json/v2/doc.go | 11 --- src/encoding/json/v2/example_test.go | 62 -------------- src/encoding/json/v2/fields.go | 26 ++---- src/encoding/json/v2/fields_test.go | 82 ++++++++++--------- src/encoding/json/v2/options.go | 17 +--- 8 files changed, 54 insertions(+), 206 deletions(-) diff --git a/src/encoding/json/internal/jsonflags/flags.go b/src/encoding/json/internal/jsonflags/flags.go index a53dfe7985..3a581a08df 100644 --- a/src/encoding/json/internal/jsonflags/flags.go +++ b/src/encoding/json/internal/jsonflags/flags.go @@ -120,7 +120,6 @@ const ( FormatNilSliceAsNull // marshal only OmitZeroStructFields // marshal only MatchCaseInsensitiveNames // marshal or unmarshal - DiscardUnknownMembers // marshal only RejectUnknownMembers // unmarshal only Marshalers // marshal only; non-boolean flag Unmarshalers // unmarshal only; non-boolean flag @@ -151,7 +150,7 @@ const ( ) // bitsUsed is the number of bits used in the 64-bit boolean flags -const bitsUsed = 42 +const bitsUsed = 41 // Static compile check that bitsUsed and maxArshalV1Flag are in sync. const _ = uint64((1<