]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json: make Number with the ,string option marshal with quotes
authorLucas Bremgartner <lucas@bremis.ch>
Fri, 13 Sep 2019 19:46:50 +0000 (19:46 +0000)
committerDaniel Martí <mvdan@mvdan.cc>
Mon, 16 Sep 2019 11:56:15 +0000 (11:56 +0000)
Add quotes when marshaling a json.Number with the string option
set via a struct tag. This ensures that the resulting json
can be unmarshaled into the source struct without error.

Fixes #34268

Change-Id: Ide167d9dec77019554870b5957b37dc258119d81
GitHub-Last-Rev: dde81b71208be01c253bb87dbb6f81ac6e0785be
GitHub-Pull-Request: golang/go#34269
Reviewed-on: https://go-review.googlesource.com/c/go/+/195043
Reviewed-by: Daniel Martí <mvdan@mvdan.cc>
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/encoding/json/encode.go
src/encoding/json/encode_test.go

index e5dd1b7799b484d6b8a5cfd0a57e6567df25f144..b4fba476c82362e0da619c83a6dc0bb368098aeb 100644 (file)
@@ -600,7 +600,13 @@ func stringEncoder(e *encodeState, v reflect.Value, opts encOpts) {
                if !isValidNumber(numStr) {
                        e.error(fmt.Errorf("json: invalid number literal %q", numStr))
                }
+               if opts.quoted {
+                       e.WriteByte('"')
+               }
                e.WriteString(numStr)
+               if opts.quoted {
+                       e.WriteByte('"')
+               }
                return
        }
        if opts.quoted {
index 18a92bae7c76e6d1b69157574f120eb41c2cae74..8d3503b1ba23ea2acf99d2b910599a2ed6f773f3 100644 (file)
@@ -76,13 +76,15 @@ type StringTag struct {
        IntStr     int64   `json:",string"`
        UintptrStr uintptr `json:",string"`
        StrStr     string  `json:",string"`
+       NumberStr  Number  `json:",string"`
 }
 
 var stringTagExpected = `{
  "BoolStr": "true",
  "IntStr": "42",
  "UintptrStr": "44",
- "StrStr": "\"xzbit\""
+ "StrStr": "\"xzbit\"",
+ "NumberStr": "46"
 }`
 
 func TestStringTag(t *testing.T) {
@@ -91,6 +93,7 @@ func TestStringTag(t *testing.T) {
        s.IntStr = 42
        s.UintptrStr = 44
        s.StrStr = "xzbit"
+       s.NumberStr = "46"
        got, err := MarshalIndent(&s, "", " ")
        if err != nil {
                t.Fatal(err)