]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json/v2: use slices.Sort directly
authorJoe Tsai <joetsai@digital-static.net>
Tue, 21 Oct 2025 17:39:15 +0000 (10:39 -0700)
committerGopher Robot <gobot@golang.org>
Fri, 24 Oct 2025 16:05:36 +0000 (09:05 -0700)
This is semantically identical and just a cleanup.

Prior to #63397, JSON object names were sorted according to UTF-16
to match the semantic of RFC 8785, but there were a number of
objections in the discussion to using that as the sorting order.

In https://github.com/go-json-experiment/json/pull/121,
we switched to sorting by UTF-8, which matches the behavior
of v1 and avoids an option to toggle the behavior.
However, we should have deleted the stringSlice.Sort method
and just directly called slices.Sort.

From a principled perspective, both UTF-16 and UTF-8 are
reasonable ways to sort JSON object names.
RFC 8259 specifies that the entire JSON text is encoded as UTF-8.
However, the way JSON strings are encoded requires escaping
Unicode codepoints according to UTF-16 surragate halves
(a quirk of JavaScript inherited by JSON).
Thus, JSON is inconsistently both UTF-8 and UTF-16.

Change-Id: Id92b5cc20efe4201827e9d3fccf24ccf894d3e60
Reviewed-on: https://go-review.googlesource.com/c/go/+/713522
Reviewed-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Bypass: Damien Neil <dneil@google.com>
Auto-Submit: Damien Neil <dneil@google.com>
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Reviewed-by: Damien Neil <dneil@google.com>
src/encoding/json/v2/arshal.go
src/encoding/json/v2/arshal_any.go
src/encoding/json/v2/arshal_default.go
src/encoding/json/v2/arshal_inlined.go

index 573d26567f3368edad8e8c9dfbda31f214db5d54..e26f3340ee2f3fad5be32afdf51cf6a92177549e 100644 (file)
@@ -11,8 +11,6 @@ import (
        "encoding"
        "io"
        "reflect"
-       "slices"
-       "strings"
        "sync"
        "time"
 
@@ -575,7 +573,3 @@ func putStrings(s *stringSlice) {
        }
        stringsPools.Put(s)
 }
-
-func (ss *stringSlice) Sort() {
-       slices.SortFunc(*ss, func(x, y string) int { return strings.Compare(x, y) })
-}
index 97a77e923766d9c691ef4c4a2677e21490694c3a..8c0c445404d8839fead216d4c7aafbf4a9a368e4 100644 (file)
@@ -10,6 +10,7 @@ import (
        "cmp"
        "math"
        "reflect"
+       "slices"
        "strconv"
 
        "encoding/json/internal"
@@ -153,7 +154,7 @@ func marshalObjectAny(enc *jsontext.Encoder, obj map[string]any, mo *jsonopts.St
                        (*names)[i] = name
                        i++
                }
-               names.Sort()
+               slices.Sort(*names)
                for _, name := range *names {
                        if err := enc.WriteToken(jsontext.String(name)); err != nil {
                                return err
index 078d345e1439c2ab51df0802aca7ebfbea3f1a6c..33931af17e642343485004d273aebc5d3a1e52bb 100644 (file)
@@ -843,7 +843,7 @@ func makeMapArshaler(t reflect.Type) *arshaler {
                                        k.SetIterKey(iter)
                                        (*names)[i] = k.String()
                                }
-                               names.Sort()
+                               slices.Sort(*names)
                                for _, name := range *names {
                                        if err := enc.WriteToken(jsontext.String(name)); err != nil {
                                                return err
index d911bfa1c04d4554a7f11ab56ca6f4c936c9a85d..03e563a0c095457e707bbb72539fc28263beed47 100644 (file)
@@ -11,6 +11,7 @@ import (
        "errors"
        "io"
        "reflect"
+       "slices"
 
        "encoding/json/internal/jsonflags"
        "encoding/json/internal/jsonopts"
@@ -146,7 +147,7 @@ func marshalInlinedFallbackAll(enc *jsontext.Encoder, va addressableValue, mo *j
                                mk.SetIterKey(iter)
                                (*names)[i] = mk.String()
                        }
-                       names.Sort()
+                       slices.Sort(*names)
                        for _, name := range *names {
                                mk.SetString(name)
                                if err := marshalKey(mk); err != nil {