Skip to content

encoding/json: json encoder fails for embedded non-struct fields #4474

@gopherbot

Description

@gopherbot

by tkappler:

What steps will reproduce the problem?

1. Run the following program using Go tip. Go 1, and therefore play.golang.org, will not
work since their JSON encoder ignores embedded fields in a struct.

----------------------------------------
package main

import (
    "encoding/json"
    "fmt"
)

type IntType int

type MyStruct struct {
    IntType
    Name string
}

func main() {
    var i IntType = 11
    a := MyStruct{i, "test"}

    jsonStr, err := json.Marshal(a)
    fmt.Println(string(jsonStr), err)
}
----------------------------------------


What is the expected output?

A JSON serialization of a, something like {"IntType": 11, "Name":
"test"}.


What do you see instead?

----------------------------------------
panic: reflect: NumField of non-struct type [recovered]
    panic: interface conversion: string is not error: missing method Error

goroutine 1 [running]:
----- stack segment boundary -----
encoding/json.func·002(0x101d0e90, 0x101d0100)
    /Users/thomas.kappler/software/go/src/pkg/encoding/json/encode.go:220 +0x92
----- stack segment boundary -----
reflect.(*rtype).NumField(0x86878, 0xc, 0xc, 0x86878)
    /Users/thomas.kappler/software/go/src/pkg/reflect/type.go:623 +0x7e
encoding/json.typeFields(0xc200042000, 0xb7868, 0xc200042000, 0xb7868, 0x0, ...)
    /Users/thomas.kappler/software/go/src/pkg/encoding/json/encode.go:607 +0x3a9
encoding/json.cachedTypeFields(0xc200042000, 0xb7868, 0x192, 0xc200042000, 0xb7868, ...)
    /Users/thomas.kappler/software/go/src/pkg/encoding/json/encode.go:694 +0xcb
encoding/json.(*encodeState).reflectValueQuoted(0xc200068000, 0xb7868, 0xc200043400,
0x192, 0x0, ...)
    /Users/thomas.kappler/software/go/src/pkg/encoding/json/encode.go:346 +0x19b5
encoding/json.(*encodeState).reflectValue(0xc200068000, 0xb7868, 0xc200043400, 0x192)
    /Users/thomas.kappler/software/go/src/pkg/encoding/json/encode.go:252 +0x48
encoding/json.(*encodeState).marshal(0xc200068000, 0xb7868, 0xc200043400, 0x0, 0x0, ...)
    /Users/thomas.kappler/software/go/src/pkg/encoding/json/encode.go:223 +0x89
encoding/json.Marshal(0xb7868, 0xc200043400, 0xcd8e8, 0x4, 0xb7868, ...)
    /Users/thomas.kappler/software/go/src/pkg/encoding/json/encode.go:117 +0x60
main.main()
    /Users/thomas.kappler/jsonEmbedded.go:19 +0x7f
----------------------------------------


Which compiler are you using (5g, 6g, 8g, gccgo)?

$ go env
GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-common"
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="EDITED/go"
GOROOT="EDITED/go"
GOTOOLDIR="EDITED/go/pkg/tool/darwin_amd64"
CGO_ENABLED="1"


Which operating system are you using?

Mac OS X 10.6.8


Which version are you using?  (run 'go version')

go version devel +697f36fec52c Fri Nov 30 20:02:30 2012 +1100


Please provide any additional information below.

Metadata

Metadata

Assignees

No one assigned

    Labels

    FrozenDueToAgeSuggestedIssues that may be good for new contributors looking for work to do.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions