]> Cypherpunks repositories - gostls13.git/commitdiff
json: fix decode bug with struct tag names with ,opts being ignored
authorBrad Fitzpatrick <bradfitz@golang.org>
Fri, 26 Aug 2011 08:27:33 +0000 (12:27 +0400)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 26 Aug 2011 08:27:33 +0000 (12:27 +0400)
When the encoder was updated to respect the ",omitempty"
struct tag options, the decoder half was never updated to know
about the new struct tag format. (the format is now an optional
name, followed by zero or more ",option" strings)

This only affected people who used ",omitempty" along with
a field name. In that case, the serialized JSON wouldn't
decode to the original value.

R=golang-dev, dvyukov
CC=golang-dev
https://golang.org/cl/4965049

src/pkg/json/decode.go
src/pkg/json/decode_test.go

index 4f6562bd552c04f77666c77bac2ecbcffb614551..6782c76c4e8bc686171c88f2f1fbb80ff23e31e9 100644 (file)
@@ -486,7 +486,7 @@ func (d *decodeState) object(v reflect.Value) {
                        if isValidTag(key) {
                                for i := 0; i < sv.NumField(); i++ {
                                        f = st.Field(i)
-                                       if f.Tag.Get("json") == key {
+                                       if tagName(f.Tag.Get("json")) == key {
                                                ok = true
                                                break
                                        }
@@ -918,3 +918,13 @@ func unquoteBytes(s []byte) (t []byte, ok bool) {
        }
        return b[0:w], true
 }
+
+// tagName extracts the field name part out of the "json" struct tag
+// value. The json struct tag format is an optional name, followed by
+// zero or more ",option" values.
+func tagName(v string) string {
+       if idx := strings.Index(v, ","); idx != -1 {
+               return v[:idx]
+       }
+       return v
+}
index a855d6048663b3eb95d1bbe67662ba00a0c286e0..4c179de5d06a6349d118e5f2515e442477db7c0c 100644 (file)
@@ -262,7 +262,8 @@ type All struct {
        Float32 float32
        Float64 float64
 
-       Foo string `json:"bar"`
+       Foo  string `json:"bar"`
+       Foo2 string `json:"bar2,dummyopt"`
 
        PBool    *bool
        PInt     *int
@@ -331,6 +332,7 @@ var allValue = All{
        Float32: 14.1,
        Float64: 15.1,
        Foo:     "foo",
+       Foo2:    "foo2",
        String:  "16",
        Map: map[string]Small{
                "17": {Tag: "tag17"},
@@ -391,6 +393,7 @@ var allValueIndent = `{
        "Float32": 14.1,
        "Float64": 15.1,
        "bar": "foo",
+       "bar2": "foo2",
        "PBool": null,
        "PInt": null,
        "PInt8": null,
@@ -481,6 +484,7 @@ var pallValueIndent = `{
        "Float32": 0,
        "Float64": 0,
        "bar": "",
+       "bar2": "",
        "PBool": true,
        "PInt": 2,
        "PInt8": 3,