]> Cypherpunks repositories - gostls13.git/commit
encoding/json: remove legacy option to EscapeInvalidUTF8
authorJoe Tsai <joetsai@digital-static.net>
Thu, 10 Jul 2025 00:08:49 +0000 (17:08 -0700)
committerGopher Robot <gobot@golang.org>
Fri, 11 Jul 2025 21:27:20 +0000 (14:27 -0700)
commit1e48ca7020adf13e0fa4a6c2053f210b869bfa24
tree949e68d0dfb190fd13d8bfa0e2a0bced1163f8f2
parenta0a99cb22b2045b15509d1002a655db407a44a50
encoding/json: remove legacy option to EscapeInvalidUTF8

In the presence of invalid UTF-8, the AllowInvalidUTF8 option
allows such bytes to be present, but silently mangles them
using the Unicode replacement character.

The v2 default is to emit the replacement character verbatim
(which is valid UTF-8 and exactly what it is for).

However, the v1 behavior has historically been to emit
the escaped form of the replacement character.
This behavior was introduced in https://go.dev/cl/11211045
where the documentation says that it is:

    replacing invalid bytes with the Unicode replacement rune U+FFFD

but the implementation actually replaces it with
the escaped form of the Unicode replacement rune.
Given that the documentation differs from the implementation,
the actual behavior is likely an oversight.

Given how esoteric of behavior this is,
we change the v1in2 behavior to avoid the unnecesary escaping
and drop support for EscapeInvalidUTF8.

This does not violate the Go compatibility agreement since
we do not document what the exact syntactic output is.
Also, there has already been prior precedence for changing the output:

* [encoding/json: encode \b and \f as '\b' and '\f' in JSON strings](https://go.dev/cl/521675)
* [encoding/json: encode \n in strings as "\n", not "\u000A"](https://go.dev/cl/4678046)
* [encoding/json: encode \t as \t instead of \u0009](https://go.dev/cl/162340043)
* [encoding/json: use standard ES6 formatting for numbers during marshal](https://go.dev/cl/30371)

Fixes #74551

Change-Id: Ib59a873c44713d302f1f6ab103ffba2520d63276
Reviewed-on: https://go-review.googlesource.com/c/go/+/687116
Auto-Submit: Joseph Tsai <joetsai@digital-static.net>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
src/encoding/json/internal/jsonflags/flags.go
src/encoding/json/internal/jsonwire/encode.go
src/encoding/json/v2_decode_test.go
src/encoding/json/v2_diff_test.go
src/encoding/json/v2_options.go