Skip to content

Commit

Permalink
Merge pull request #409 from brongineers/master
Browse files Browse the repository at this point in the history
Ignore MarshalJSON when encoding map's key
  • Loading branch information
goccy authored Nov 15, 2022
2 parents 41ad89f + 6bca989 commit 32ec93b
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 4 deletions.
28 changes: 26 additions & 2 deletions encode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1022,19 +1022,28 @@ func (u *unmarshalerText) UnmarshalText(b []byte) error {
}

func TestTextMarshalerMapKeysAreSorted(t *testing.T) {
b, err := json.Marshal(map[unmarshalerText]int{
data := map[unmarshalerText]int{
{"x", "y"}: 1,
{"y", "x"}: 2,
{"a", "z"}: 3,
{"z", "a"}: 4,
})
}
b, err := json.Marshal(data)
if err != nil {
t.Fatalf("Failed to Marshal text.Marshaler: %v", err)
}
const want = `{"a:z":3,"x:y":1,"y:x":2,"z:a":4}`
if string(b) != want {
t.Errorf("Marshal map with text.Marshaler keys: got %#q, want %#q", b, want)
}

b, err = stdjson.Marshal(data)
if err != nil {
t.Fatalf("Failed to std Marshal text.Marshaler: %v", err)
}
if string(b) != want {
t.Errorf("std Marshal map with text.Marshaler keys: got %#q, want %#q", b, want)
}
}

// https://golang.org/issue/33675
Expand Down Expand Up @@ -2605,3 +2614,18 @@ func TestIssue386(t *testing.T) {
t.Error(err)
}
}

type customMapKey string

func (b customMapKey) MarshalJSON() ([]byte, error) {
return []byte("[]"), nil
}

func TestCustomMarshalForMapKey(t *testing.T) {
m := map[customMapKey]string{customMapKey("skipcustom"): "test"}
expected, err := stdjson.Marshal(m)
assertErr(t, err)
got, err := json.Marshal(m)
assertErr(t, err)
assertEq(t, "custom map key", string(expected), string(got))
}
2 changes: 0 additions & 2 deletions internal/encoder/compiler.go
Original file line number Diff line number Diff line change
Expand Up @@ -506,8 +506,6 @@ func (c *Compiler) listElemCode(typ *runtime.Type) (Code, error) {

func (c *Compiler) mapKeyCode(typ *runtime.Type) (Code, error) {
switch {
case c.implementsMarshalJSON(typ):
return c.marshalJSONCode(typ)
case c.implementsMarshalText(typ):
return c.marshalTextCode(typ)
}
Expand Down

0 comments on commit 32ec93b

Please sign in to comment.