Skip to content

Commit

Permalink
Merge pull request #379 from orisano/fix/#370
Browse files Browse the repository at this point in the history
Fix slice/array type encoding with types implementing MarshalJSON
  • Loading branch information
goccy committed Jul 7, 2022
2 parents 554506d + 565e07e commit 8459403
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
29 changes: 29 additions & 0 deletions encode_test.go
Expand Up @@ -2424,3 +2424,32 @@ func TestIssue376(t *testing.T) {
t.Errorf("unexpected result: %v != %v", got, expected)
}
}

type Issue370 struct {
String string
Valid bool
}

func (i *Issue370) MarshalJSON() ([]byte, error) {
if !i.Valid {
return json.Marshal(nil)
}
return json.Marshal(i.String)
}

func TestIssue370(t *testing.T) {
v := []struct {
V Issue370
}{
{V: Issue370{String: "test", Valid: true}},
}
b, err := json.Marshal(v)
if err != nil {
t.Fatal(err)
}
got := string(b)
expected := `[{"V":"test"}]`
if got != expected {
t.Errorf("unexpected result: %v != %v", got, expected)
}
}
3 changes: 2 additions & 1 deletion internal/encoder/compiler.go
Expand Up @@ -487,7 +487,8 @@ func (c *Compiler) listElemCode(typ *runtime.Type) (Code, error) {
case typ.Kind() == reflect.Map:
return c.ptrCode(runtime.PtrTo(typ))
default:
code, err := c.typeToCodeWithPtr(typ, false)
// Strictly not isPtr == true, but reflect.ValueOf().Index() is canAddr, so set isPtr == true.
code, err := c.typeToCodeWithPtr(typ, true)
if err != nil {
return nil, err
}
Expand Down

0 comments on commit 8459403

Please sign in to comment.