Merge pull request #379 from orisano/fix/#370

Fix slice/array type encoding with types implementing MarshalJSON
This commit is contained in:
Masaaki Goshima 2022-07-07 14:46:02 +09:00 committed by GitHub
commit 8459403e25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 1 deletions

View File

@ -2424,3 +2424,32 @@ func TestIssue376(t *testing.T) {
t.Errorf("unexpected result: %v != %v", got, expected) 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)
}
}

View File

@ -487,7 +487,8 @@ func (c *Compiler) listElemCode(typ *runtime.Type) (Code, error) {
case typ.Kind() == reflect.Map: case typ.Kind() == reflect.Map:
return c.ptrCode(runtime.PtrTo(typ)) return c.ptrCode(runtime.PtrTo(typ))
default: 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 { if err != nil {
return nil, err return nil, err
} }