Home | History | Annotate | Download | only in json
      1 // Copyright 2010 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package json
      6 
      7 import (
      8 	"bytes"
      9 	"encoding"
     10 	"errors"
     11 	"fmt"
     12 	"image"
     13 	"math"
     14 	"math/big"
     15 	"net"
     16 	"reflect"
     17 	"strconv"
     18 	"strings"
     19 	"testing"
     20 	"time"
     21 )
     22 
     23 type T struct {
     24 	X string
     25 	Y int
     26 	Z int `json:"-"`
     27 }
     28 
     29 type U struct {
     30 	Alphabet string `json:"alpha"`
     31 }
     32 
     33 type V struct {
     34 	F1 interface{}
     35 	F2 int32
     36 	F3 Number
     37 	F4 *VOuter
     38 }
     39 
     40 type VOuter struct {
     41 	V V
     42 }
     43 
     44 // ifaceNumAsFloat64/ifaceNumAsNumber are used to test unmarshaling with and
     45 // without UseNumber
     46 var ifaceNumAsFloat64 = map[string]interface{}{
     47 	"k1": float64(1),
     48 	"k2": "s",
     49 	"k3": []interface{}{float64(1), float64(2.0), float64(3e-3)},
     50 	"k4": map[string]interface{}{"kk1": "s", "kk2": float64(2)},
     51 }
     52 
     53 var ifaceNumAsNumber = map[string]interface{}{
     54 	"k1": Number("1"),
     55 	"k2": "s",
     56 	"k3": []interface{}{Number("1"), Number("2.0"), Number("3e-3")},
     57 	"k4": map[string]interface{}{"kk1": "s", "kk2": Number("2")},
     58 }
     59 
     60 type tx struct {
     61 	x int
     62 }
     63 
     64 type u8 uint8
     65 
     66 // A type that can unmarshal itself.
     67 
     68 type unmarshaler struct {
     69 	T bool
     70 }
     71 
     72 func (u *unmarshaler) UnmarshalJSON(b []byte) error {
     73 	*u = unmarshaler{true} // All we need to see that UnmarshalJSON is called.
     74 	return nil
     75 }
     76 
     77 type ustruct struct {
     78 	M unmarshaler
     79 }
     80 
     81 type unmarshalerText struct {
     82 	A, B string
     83 }
     84 
     85 // needed for re-marshaling tests
     86 func (u unmarshalerText) MarshalText() ([]byte, error) {
     87 	return []byte(u.A + ":" + u.B), nil
     88 }
     89 
     90 func (u *unmarshalerText) UnmarshalText(b []byte) error {
     91 	pos := bytes.Index(b, []byte(":"))
     92 	if pos == -1 {
     93 		return errors.New("missing separator")
     94 	}
     95 	u.A, u.B = string(b[:pos]), string(b[pos+1:])
     96 	return nil
     97 }
     98 
     99 var _ encoding.TextUnmarshaler = (*unmarshalerText)(nil)
    100 
    101 type ustructText struct {
    102 	M unmarshalerText
    103 }
    104 
    105 // u8marshal is an integer type that can marshal/unmarshal itself.
    106 type u8marshal uint8
    107 
    108 func (u8 u8marshal) MarshalText() ([]byte, error) {
    109 	return []byte(fmt.Sprintf("u%d", u8)), nil
    110 }
    111 
    112 var errMissingU8Prefix = errors.New("missing 'u' prefix")
    113 
    114 func (u8 *u8marshal) UnmarshalText(b []byte) error {
    115 	if !bytes.HasPrefix(b, []byte{'u'}) {
    116 		return errMissingU8Prefix
    117 	}
    118 	n, err := strconv.Atoi(string(b[1:]))
    119 	if err != nil {
    120 		return err
    121 	}
    122 	*u8 = u8marshal(n)
    123 	return nil
    124 }
    125 
    126 var _ encoding.TextUnmarshaler = (*u8marshal)(nil)
    127 
    128 var (
    129 	um0, um1 unmarshaler // target2 of unmarshaling
    130 	ump      = &um1
    131 	umtrue   = unmarshaler{true}
    132 	umslice  = []unmarshaler{{true}}
    133 	umslicep = new([]unmarshaler)
    134 	umstruct = ustruct{unmarshaler{true}}
    135 
    136 	um0T, um1T   unmarshalerText // target2 of unmarshaling
    137 	umpType      = &um1T
    138 	umtrueXY     = unmarshalerText{"x", "y"}
    139 	umsliceXY    = []unmarshalerText{{"x", "y"}}
    140 	umslicepType = new([]unmarshalerText)
    141 	umstructType = new(ustructText)
    142 	umstructXY   = ustructText{unmarshalerText{"x", "y"}}
    143 
    144 	ummapType = map[unmarshalerText]bool{}
    145 	ummapXY   = map[unmarshalerText]bool{unmarshalerText{"x", "y"}: true}
    146 )
    147 
    148 // Test data structures for anonymous fields.
    149 
    150 type Point struct {
    151 	Z int
    152 }
    153 
    154 type Top struct {
    155 	Level0 int
    156 	Embed0
    157 	*Embed0a
    158 	*Embed0b `json:"e,omitempty"` // treated as named
    159 	Embed0c  `json:"-"`           // ignored
    160 	Loop
    161 	Embed0p // has Point with X, Y, used
    162 	Embed0q // has Point with Z, used
    163 	embed   // contains exported field
    164 }
    165 
    166 type Embed0 struct {
    167 	Level1a int // overridden by Embed0a's Level1a with json tag
    168 	Level1b int // used because Embed0a's Level1b is renamed
    169 	Level1c int // used because Embed0a's Level1c is ignored
    170 	Level1d int // annihilated by Embed0a's Level1d
    171 	Level1e int `json:"x"` // annihilated by Embed0a.Level1e
    172 }
    173 
    174 type Embed0a struct {
    175 	Level1a int `json:"Level1a,omitempty"`
    176 	Level1b int `json:"LEVEL1B,omitempty"`
    177 	Level1c int `json:"-"`
    178 	Level1d int // annihilated by Embed0's Level1d
    179 	Level1f int `json:"x"` // annihilated by Embed0's Level1e
    180 }
    181 
    182 type Embed0b Embed0
    183 
    184 type Embed0c Embed0
    185 
    186 type Embed0p struct {
    187 	image.Point
    188 }
    189 
    190 type Embed0q struct {
    191 	Point
    192 }
    193 
    194 type embed struct {
    195 	Q int
    196 }
    197 
    198 type Loop struct {
    199 	Loop1 int `json:",omitempty"`
    200 	Loop2 int `json:",omitempty"`
    201 	*Loop
    202 }
    203 
    204 // From reflect test:
    205 // The X in S6 and S7 annihilate, but they also block the X in S8.S9.
    206 type S5 struct {
    207 	S6
    208 	S7
    209 	S8
    210 }
    211 
    212 type S6 struct {
    213 	X int
    214 }
    215 
    216 type S7 S6
    217 
    218 type S8 struct {
    219 	S9
    220 }
    221 
    222 type S9 struct {
    223 	X int
    224 	Y int
    225 }
    226 
    227 // From reflect test:
    228 // The X in S11.S6 and S12.S6 annihilate, but they also block the X in S13.S8.S9.
    229 type S10 struct {
    230 	S11
    231 	S12
    232 	S13
    233 }
    234 
    235 type S11 struct {
    236 	S6
    237 }
    238 
    239 type S12 struct {
    240 	S6
    241 }
    242 
    243 type S13 struct {
    244 	S8
    245 }
    246 
    247 type Ambig struct {
    248 	// Given "hello", the first match should win.
    249 	First  int `json:"HELLO"`
    250 	Second int `json:"Hello"`
    251 }
    252 
    253 type XYZ struct {
    254 	X interface{}
    255 	Y interface{}
    256 	Z interface{}
    257 }
    258 
    259 func sliceAddr(x []int) *[]int                 { return &x }
    260 func mapAddr(x map[string]int) *map[string]int { return &x }
    261 
    262 type byteWithMarshalJSON byte
    263 
    264 func (b byteWithMarshalJSON) MarshalJSON() ([]byte, error) {
    265 	return []byte(fmt.Sprintf(`"Z%.2x"`, byte(b))), nil
    266 }
    267 
    268 func (b *byteWithMarshalJSON) UnmarshalJSON(data []byte) error {
    269 	if len(data) != 5 || data[0] != '"' || data[1] != 'Z' || data[4] != '"' {
    270 		return fmt.Errorf("bad quoted string")
    271 	}
    272 	i, err := strconv.ParseInt(string(data[2:4]), 16, 8)
    273 	if err != nil {
    274 		return fmt.Errorf("bad hex")
    275 	}
    276 	*b = byteWithMarshalJSON(i)
    277 	return nil
    278 }
    279 
    280 type byteWithPtrMarshalJSON byte
    281 
    282 func (b *byteWithPtrMarshalJSON) MarshalJSON() ([]byte, error) {
    283 	return byteWithMarshalJSON(*b).MarshalJSON()
    284 }
    285 
    286 func (b *byteWithPtrMarshalJSON) UnmarshalJSON(data []byte) error {
    287 	return (*byteWithMarshalJSON)(b).UnmarshalJSON(data)
    288 }
    289 
    290 type byteWithMarshalText byte
    291 
    292 func (b byteWithMarshalText) MarshalText() ([]byte, error) {
    293 	return []byte(fmt.Sprintf(`Z%.2x`, byte(b))), nil
    294 }
    295 
    296 func (b *byteWithMarshalText) UnmarshalText(data []byte) error {
    297 	if len(data) != 3 || data[0] != 'Z' {
    298 		return fmt.Errorf("bad quoted string")
    299 	}
    300 	i, err := strconv.ParseInt(string(data[1:3]), 16, 8)
    301 	if err != nil {
    302 		return fmt.Errorf("bad hex")
    303 	}
    304 	*b = byteWithMarshalText(i)
    305 	return nil
    306 }
    307 
    308 type byteWithPtrMarshalText byte
    309 
    310 func (b *byteWithPtrMarshalText) MarshalText() ([]byte, error) {
    311 	return byteWithMarshalText(*b).MarshalText()
    312 }
    313 
    314 func (b *byteWithPtrMarshalText) UnmarshalText(data []byte) error {
    315 	return (*byteWithMarshalText)(b).UnmarshalText(data)
    316 }
    317 
    318 type intWithMarshalJSON int
    319 
    320 func (b intWithMarshalJSON) MarshalJSON() ([]byte, error) {
    321 	return []byte(fmt.Sprintf(`"Z%.2x"`, int(b))), nil
    322 }
    323 
    324 func (b *intWithMarshalJSON) UnmarshalJSON(data []byte) error {
    325 	if len(data) != 5 || data[0] != '"' || data[1] != 'Z' || data[4] != '"' {
    326 		return fmt.Errorf("bad quoted string")
    327 	}
    328 	i, err := strconv.ParseInt(string(data[2:4]), 16, 8)
    329 	if err != nil {
    330 		return fmt.Errorf("bad hex")
    331 	}
    332 	*b = intWithMarshalJSON(i)
    333 	return nil
    334 }
    335 
    336 type intWithPtrMarshalJSON int
    337 
    338 func (b *intWithPtrMarshalJSON) MarshalJSON() ([]byte, error) {
    339 	return intWithMarshalJSON(*b).MarshalJSON()
    340 }
    341 
    342 func (b *intWithPtrMarshalJSON) UnmarshalJSON(data []byte) error {
    343 	return (*intWithMarshalJSON)(b).UnmarshalJSON(data)
    344 }
    345 
    346 type intWithMarshalText int
    347 
    348 func (b intWithMarshalText) MarshalText() ([]byte, error) {
    349 	return []byte(fmt.Sprintf(`Z%.2x`, int(b))), nil
    350 }
    351 
    352 func (b *intWithMarshalText) UnmarshalText(data []byte) error {
    353 	if len(data) != 3 || data[0] != 'Z' {
    354 		return fmt.Errorf("bad quoted string")
    355 	}
    356 	i, err := strconv.ParseInt(string(data[1:3]), 16, 8)
    357 	if err != nil {
    358 		return fmt.Errorf("bad hex")
    359 	}
    360 	*b = intWithMarshalText(i)
    361 	return nil
    362 }
    363 
    364 type intWithPtrMarshalText int
    365 
    366 func (b *intWithPtrMarshalText) MarshalText() ([]byte, error) {
    367 	return intWithMarshalText(*b).MarshalText()
    368 }
    369 
    370 func (b *intWithPtrMarshalText) UnmarshalText(data []byte) error {
    371 	return (*intWithMarshalText)(b).UnmarshalText(data)
    372 }
    373 
    374 type unmarshalTest struct {
    375 	in        string
    376 	ptr       interface{}
    377 	out       interface{}
    378 	err       error
    379 	useNumber bool
    380 	golden    bool
    381 }
    382 
    383 type B struct {
    384 	B bool `json:",string"`
    385 }
    386 
    387 var unmarshalTests = []unmarshalTest{
    388 	// basic types
    389 	{in: `true`, ptr: new(bool), out: true},
    390 	{in: `1`, ptr: new(int), out: 1},
    391 	{in: `1.2`, ptr: new(float64), out: 1.2},
    392 	{in: `-5`, ptr: new(int16), out: int16(-5)},
    393 	{in: `2`, ptr: new(Number), out: Number("2"), useNumber: true},
    394 	{in: `2`, ptr: new(Number), out: Number("2")},
    395 	{in: `2`, ptr: new(interface{}), out: float64(2.0)},
    396 	{in: `2`, ptr: new(interface{}), out: Number("2"), useNumber: true},
    397 	{in: `"a\u1234"`, ptr: new(string), out: "a\u1234"},
    398 	{in: `"http:\/\/"`, ptr: new(string), out: "http://"},
    399 	{in: `"g-clef: \uD834\uDD1E"`, ptr: new(string), out: "g-clef: \U0001D11E"},
    400 	{in: `"invalid: \uD834x\uDD1E"`, ptr: new(string), out: "invalid: \uFFFDx\uFFFD"},
    401 	{in: "null", ptr: new(interface{}), out: nil},
    402 	{in: `{"X": [1,2,3], "Y": 4}`, ptr: new(T), out: T{Y: 4}, err: &UnmarshalTypeError{"array", reflect.TypeOf(""), 7, "T", "X"}},
    403 	{in: `{"x": 1}`, ptr: new(tx), out: tx{}},
    404 	{in: `{"F1":1,"F2":2,"F3":3}`, ptr: new(V), out: V{F1: float64(1), F2: int32(2), F3: Number("3")}},
    405 	{in: `{"F1":1,"F2":2,"F3":3}`, ptr: new(V), out: V{F1: Number("1"), F2: int32(2), F3: Number("3")}, useNumber: true},
    406 	{in: `{"k1":1,"k2":"s","k3":[1,2.0,3e-3],"k4":{"kk1":"s","kk2":2}}`, ptr: new(interface{}), out: ifaceNumAsFloat64},
    407 	{in: `{"k1":1,"k2":"s","k3":[1,2.0,3e-3],"k4":{"kk1":"s","kk2":2}}`, ptr: new(interface{}), out: ifaceNumAsNumber, useNumber: true},
    408 
    409 	// raw values with whitespace
    410 	{in: "\n true ", ptr: new(bool), out: true},
    411 	{in: "\t 1 ", ptr: new(int), out: 1},
    412 	{in: "\r 1.2 ", ptr: new(float64), out: 1.2},
    413 	{in: "\t -5 \n", ptr: new(int16), out: int16(-5)},
    414 	{in: "\t \"a\\u1234\" \n", ptr: new(string), out: "a\u1234"},
    415 
    416 	// Z has a "-" tag.
    417 	{in: `{"Y": 1, "Z": 2}`, ptr: new(T), out: T{Y: 1}},
    418 
    419 	{in: `{"alpha": "abc", "alphabet": "xyz"}`, ptr: new(U), out: U{Alphabet: "abc"}},
    420 	{in: `{"alpha": "abc"}`, ptr: new(U), out: U{Alphabet: "abc"}},
    421 	{in: `{"alphabet": "xyz"}`, ptr: new(U), out: U{}},
    422 
    423 	// syntax errors
    424 	{in: `{"X": "foo", "Y"}`, err: &SyntaxError{"invalid character '}' after object key", 17}},
    425 	{in: `[1, 2, 3+]`, err: &SyntaxError{"invalid character '+' after array element", 9}},
    426 	{in: `{"X":12x}`, err: &SyntaxError{"invalid character 'x' after object key:value pair", 8}, useNumber: true},
    427 
    428 	// raw value errors
    429 	{in: "\x01 42", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
    430 	{in: " 42 \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 5}},
    431 	{in: "\x01 true", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
    432 	{in: " false \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 8}},
    433 	{in: "\x01 1.2", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
    434 	{in: " 3.4 \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 6}},
    435 	{in: "\x01 \"string\"", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}},
    436 	{in: " \"string\" \x01", err: &SyntaxError{"invalid character '\\x01' after top-level value", 11}},
    437 
    438 	// array tests
    439 	{in: `[1, 2, 3]`, ptr: new([3]int), out: [3]int{1, 2, 3}},
    440 	{in: `[1, 2, 3]`, ptr: new([1]int), out: [1]int{1}},
    441 	{in: `[1, 2, 3]`, ptr: new([5]int), out: [5]int{1, 2, 3, 0, 0}},
    442 
    443 	// empty array to interface test
    444 	{in: `[]`, ptr: new([]interface{}), out: []interface{}{}},
    445 	{in: `null`, ptr: new([]interface{}), out: []interface{}(nil)},
    446 	{in: `{"T":[]}`, ptr: new(map[string]interface{}), out: map[string]interface{}{"T": []interface{}{}}},
    447 	{in: `{"T":null}`, ptr: new(map[string]interface{}), out: map[string]interface{}{"T": interface{}(nil)}},
    448 
    449 	// composite tests
    450 	{in: allValueIndent, ptr: new(All), out: allValue},
    451 	{in: allValueCompact, ptr: new(All), out: allValue},
    452 	{in: allValueIndent, ptr: new(*All), out: &allValue},
    453 	{in: allValueCompact, ptr: new(*All), out: &allValue},
    454 	{in: pallValueIndent, ptr: new(All), out: pallValue},
    455 	{in: pallValueCompact, ptr: new(All), out: pallValue},
    456 	{in: pallValueIndent, ptr: new(*All), out: &pallValue},
    457 	{in: pallValueCompact, ptr: new(*All), out: &pallValue},
    458 
    459 	// unmarshal interface test
    460 	{in: `{"T":false}`, ptr: &um0, out: umtrue}, // use "false" so test will fail if custom unmarshaler is not called
    461 	{in: `{"T":false}`, ptr: &ump, out: &umtrue},
    462 	{in: `[{"T":false}]`, ptr: &umslice, out: umslice},
    463 	{in: `[{"T":false}]`, ptr: &umslicep, out: &umslice},
    464 	{in: `{"M":{"T":"x:y"}}`, ptr: &umstruct, out: umstruct},
    465 
    466 	// UnmarshalText interface test
    467 	{in: `"x:y"`, ptr: &um0T, out: umtrueXY},
    468 	{in: `"x:y"`, ptr: &umpType, out: &umtrueXY},
    469 	{in: `["x:y"]`, ptr: &umsliceXY, out: umsliceXY},
    470 	{in: `["x:y"]`, ptr: &umslicepType, out: &umsliceXY},
    471 	{in: `{"M":"x:y"}`, ptr: umstructType, out: umstructXY},
    472 
    473 	// integer-keyed map test
    474 	{
    475 		in:  `{"-1":"a","0":"b","1":"c"}`,
    476 		ptr: new(map[int]string),
    477 		out: map[int]string{-1: "a", 0: "b", 1: "c"},
    478 	},
    479 	{
    480 		in:  `{"0":"a","10":"c","9":"b"}`,
    481 		ptr: new(map[u8]string),
    482 		out: map[u8]string{0: "a", 9: "b", 10: "c"},
    483 	},
    484 	{
    485 		in:  `{"-9223372036854775808":"min","9223372036854775807":"max"}`,
    486 		ptr: new(map[int64]string),
    487 		out: map[int64]string{math.MinInt64: "min", math.MaxInt64: "max"},
    488 	},
    489 	{
    490 		in:  `{"18446744073709551615":"max"}`,
    491 		ptr: new(map[uint64]string),
    492 		out: map[uint64]string{math.MaxUint64: "max"},
    493 	},
    494 	{
    495 		in:  `{"0":false,"10":true}`,
    496 		ptr: new(map[uintptr]bool),
    497 		out: map[uintptr]bool{0: false, 10: true},
    498 	},
    499 
    500 	// Check that MarshalText and UnmarshalText take precedence
    501 	// over default integer handling in map keys.
    502 	{
    503 		in:  `{"u2":4}`,
    504 		ptr: new(map[u8marshal]int),
    505 		out: map[u8marshal]int{2: 4},
    506 	},
    507 	{
    508 		in:  `{"2":4}`,
    509 		ptr: new(map[u8marshal]int),
    510 		err: errMissingU8Prefix,
    511 	},
    512 
    513 	// integer-keyed map errors
    514 	{
    515 		in:  `{"abc":"abc"}`,
    516 		ptr: new(map[int]string),
    517 		err: &UnmarshalTypeError{Value: "number abc", Type: reflect.TypeOf(0), Offset: 2},
    518 	},
    519 	{
    520 		in:  `{"256":"abc"}`,
    521 		ptr: new(map[uint8]string),
    522 		err: &UnmarshalTypeError{Value: "number 256", Type: reflect.TypeOf(uint8(0)), Offset: 2},
    523 	},
    524 	{
    525 		in:  `{"128":"abc"}`,
    526 		ptr: new(map[int8]string),
    527 		err: &UnmarshalTypeError{Value: "number 128", Type: reflect.TypeOf(int8(0)), Offset: 2},
    528 	},
    529 	{
    530 		in:  `{"-1":"abc"}`,
    531 		ptr: new(map[uint8]string),
    532 		err: &UnmarshalTypeError{Value: "number -1", Type: reflect.TypeOf(uint8(0)), Offset: 2},
    533 	},
    534 
    535 	// Map keys can be encoding.TextUnmarshalers.
    536 	{in: `{"x:y":true}`, ptr: &ummapType, out: ummapXY},
    537 	// If multiple values for the same key exists, only the most recent value is used.
    538 	{in: `{"x:y":false,"x:y":true}`, ptr: &ummapType, out: ummapXY},
    539 
    540 	// Overwriting of data.
    541 	// This is different from package xml, but it's what we've always done.
    542 	// Now documented and tested.
    543 	{in: `[2]`, ptr: sliceAddr([]int{1}), out: []int{2}},
    544 	{in: `{"key": 2}`, ptr: mapAddr(map[string]int{"old": 0, "key": 1}), out: map[string]int{"key": 2}},
    545 
    546 	{
    547 		in: `{
    548 			"Level0": 1,
    549 			"Level1b": 2,
    550 			"Level1c": 3,
    551 			"x": 4,
    552 			"Level1a": 5,
    553 			"LEVEL1B": 6,
    554 			"e": {
    555 				"Level1a": 8,
    556 				"Level1b": 9,
    557 				"Level1c": 10,
    558 				"Level1d": 11,
    559 				"x": 12
    560 			},
    561 			"Loop1": 13,
    562 			"Loop2": 14,
    563 			"X": 15,
    564 			"Y": 16,
    565 			"Z": 17,
    566 			"Q": 18
    567 		}`,
    568 		ptr: new(Top),
    569 		out: Top{
    570 			Level0: 1,
    571 			Embed0: Embed0{
    572 				Level1b: 2,
    573 				Level1c: 3,
    574 			},
    575 			Embed0a: &Embed0a{
    576 				Level1a: 5,
    577 				Level1b: 6,
    578 			},
    579 			Embed0b: &Embed0b{
    580 				Level1a: 8,
    581 				Level1b: 9,
    582 				Level1c: 10,
    583 				Level1d: 11,
    584 				Level1e: 12,
    585 			},
    586 			Loop: Loop{
    587 				Loop1: 13,
    588 				Loop2: 14,
    589 			},
    590 			Embed0p: Embed0p{
    591 				Point: image.Point{X: 15, Y: 16},
    592 			},
    593 			Embed0q: Embed0q{
    594 				Point: Point{Z: 17},
    595 			},
    596 			embed: embed{
    597 				Q: 18,
    598 			},
    599 		},
    600 	},
    601 	{
    602 		in:  `{"hello": 1}`,
    603 		ptr: new(Ambig),
    604 		out: Ambig{First: 1},
    605 	},
    606 
    607 	{
    608 		in:  `{"X": 1,"Y":2}`,
    609 		ptr: new(S5),
    610 		out: S5{S8: S8{S9: S9{Y: 2}}},
    611 	},
    612 	{
    613 		in:  `{"X": 1,"Y":2}`,
    614 		ptr: new(S10),
    615 		out: S10{S13: S13{S8: S8{S9: S9{Y: 2}}}},
    616 	},
    617 
    618 	// invalid UTF-8 is coerced to valid UTF-8.
    619 	{
    620 		in:  "\"hello\xffworld\"",
    621 		ptr: new(string),
    622 		out: "hello\ufffdworld",
    623 	},
    624 	{
    625 		in:  "\"hello\xc2\xc2world\"",
    626 		ptr: new(string),
    627 		out: "hello\ufffd\ufffdworld",
    628 	},
    629 	{
    630 		in:  "\"hello\xc2\xffworld\"",
    631 		ptr: new(string),
    632 		out: "hello\ufffd\ufffdworld",
    633 	},
    634 	{
    635 		in:  "\"hello\\ud800world\"",
    636 		ptr: new(string),
    637 		out: "hello\ufffdworld",
    638 	},
    639 	{
    640 		in:  "\"hello\\ud800\\ud800world\"",
    641 		ptr: new(string),
    642 		out: "hello\ufffd\ufffdworld",
    643 	},
    644 	{
    645 		in:  "\"hello\\ud800\\ud800world\"",
    646 		ptr: new(string),
    647 		out: "hello\ufffd\ufffdworld",
    648 	},
    649 	{
    650 		in:  "\"hello\xed\xa0\x80\xed\xb0\x80world\"",
    651 		ptr: new(string),
    652 		out: "hello\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdworld",
    653 	},
    654 
    655 	// Used to be issue 8305, but time.Time implements encoding.TextUnmarshaler so this works now.
    656 	{
    657 		in:  `{"2009-11-10T23:00:00Z": "hello world"}`,
    658 		ptr: &map[time.Time]string{},
    659 		out: map[time.Time]string{time.Date(2009, 11, 10, 23, 0, 0, 0, time.UTC): "hello world"},
    660 	},
    661 
    662 	// issue 8305
    663 	{
    664 		in:  `{"2009-11-10T23:00:00Z": "hello world"}`,
    665 		ptr: &map[Point]string{},
    666 		err: &UnmarshalTypeError{Value: "object", Type: reflect.TypeOf(map[Point]string{}), Offset: 1},
    667 	},
    668 	{
    669 		in:  `{"asdf": "hello world"}`,
    670 		ptr: &map[unmarshaler]string{},
    671 		err: &UnmarshalTypeError{Value: "object", Type: reflect.TypeOf(map[unmarshaler]string{}), Offset: 1},
    672 	},
    673 
    674 	// related to issue 13783.
    675 	// Go 1.7 changed marshaling a slice of typed byte to use the methods on the byte type,
    676 	// similar to marshaling a slice of typed int.
    677 	// These tests check that, assuming the byte type also has valid decoding methods,
    678 	// either the old base64 string encoding or the new per-element encoding can be
    679 	// successfully unmarshaled. The custom unmarshalers were accessible in earlier
    680 	// versions of Go, even though the custom marshaler was not.
    681 	{
    682 		in:  `"AQID"`,
    683 		ptr: new([]byteWithMarshalJSON),
    684 		out: []byteWithMarshalJSON{1, 2, 3},
    685 	},
    686 	{
    687 		in:     `["Z01","Z02","Z03"]`,
    688 		ptr:    new([]byteWithMarshalJSON),
    689 		out:    []byteWithMarshalJSON{1, 2, 3},
    690 		golden: true,
    691 	},
    692 	{
    693 		in:  `"AQID"`,
    694 		ptr: new([]byteWithMarshalText),
    695 		out: []byteWithMarshalText{1, 2, 3},
    696 	},
    697 	{
    698 		in:     `["Z01","Z02","Z03"]`,
    699 		ptr:    new([]byteWithMarshalText),
    700 		out:    []byteWithMarshalText{1, 2, 3},
    701 		golden: true,
    702 	},
    703 	{
    704 		in:  `"AQID"`,
    705 		ptr: new([]byteWithPtrMarshalJSON),
    706 		out: []byteWithPtrMarshalJSON{1, 2, 3},
    707 	},
    708 	{
    709 		in:     `["Z01","Z02","Z03"]`,
    710 		ptr:    new([]byteWithPtrMarshalJSON),
    711 		out:    []byteWithPtrMarshalJSON{1, 2, 3},
    712 		golden: true,
    713 	},
    714 	{
    715 		in:  `"AQID"`,
    716 		ptr: new([]byteWithPtrMarshalText),
    717 		out: []byteWithPtrMarshalText{1, 2, 3},
    718 	},
    719 	{
    720 		in:     `["Z01","Z02","Z03"]`,
    721 		ptr:    new([]byteWithPtrMarshalText),
    722 		out:    []byteWithPtrMarshalText{1, 2, 3},
    723 		golden: true,
    724 	},
    725 
    726 	// ints work with the marshaler but not the base64 []byte case
    727 	{
    728 		in:     `["Z01","Z02","Z03"]`,
    729 		ptr:    new([]intWithMarshalJSON),
    730 		out:    []intWithMarshalJSON{1, 2, 3},
    731 		golden: true,
    732 	},
    733 	{
    734 		in:     `["Z01","Z02","Z03"]`,
    735 		ptr:    new([]intWithMarshalText),
    736 		out:    []intWithMarshalText{1, 2, 3},
    737 		golden: true,
    738 	},
    739 	{
    740 		in:     `["Z01","Z02","Z03"]`,
    741 		ptr:    new([]intWithPtrMarshalJSON),
    742 		out:    []intWithPtrMarshalJSON{1, 2, 3},
    743 		golden: true,
    744 	},
    745 	{
    746 		in:     `["Z01","Z02","Z03"]`,
    747 		ptr:    new([]intWithPtrMarshalText),
    748 		out:    []intWithPtrMarshalText{1, 2, 3},
    749 		golden: true,
    750 	},
    751 
    752 	{in: `0.000001`, ptr: new(float64), out: 0.000001, golden: true},
    753 	{in: `1e-7`, ptr: new(float64), out: 1e-7, golden: true},
    754 	{in: `100000000000000000000`, ptr: new(float64), out: 100000000000000000000.0, golden: true},
    755 	{in: `1e+21`, ptr: new(float64), out: 1e21, golden: true},
    756 	{in: `-0.000001`, ptr: new(float64), out: -0.000001, golden: true},
    757 	{in: `-1e-7`, ptr: new(float64), out: -1e-7, golden: true},
    758 	{in: `-100000000000000000000`, ptr: new(float64), out: -100000000000000000000.0, golden: true},
    759 	{in: `-1e+21`, ptr: new(float64), out: -1e21, golden: true},
    760 	{in: `999999999999999900000`, ptr: new(float64), out: 999999999999999900000.0, golden: true},
    761 	{in: `9007199254740992`, ptr: new(float64), out: 9007199254740992.0, golden: true},
    762 	{in: `9007199254740993`, ptr: new(float64), out: 9007199254740992.0, golden: false},
    763 
    764 	{
    765 		in:  `{"V": {"F2": "hello"}}`,
    766 		ptr: new(VOuter),
    767 		err: &UnmarshalTypeError{
    768 			Value:  "string",
    769 			Struct: "V",
    770 			Field:  "F2",
    771 			Type:   reflect.TypeOf(int32(0)),
    772 			Offset: 20,
    773 		},
    774 	},
    775 	{
    776 		in:  `{"V": {"F4": {}, "F2": "hello"}}`,
    777 		ptr: new(VOuter),
    778 		err: &UnmarshalTypeError{
    779 			Value:  "string",
    780 			Struct: "V",
    781 			Field:  "F2",
    782 			Type:   reflect.TypeOf(int32(0)),
    783 			Offset: 30,
    784 		},
    785 	},
    786 
    787 	// issue 15146.
    788 	// invalid inputs in wrongStringTests below.
    789 	{in: `{"B":"true"}`, ptr: new(B), out: B{true}, golden: true},
    790 	{in: `{"B":"false"}`, ptr: new(B), out: B{false}, golden: true},
    791 	{in: `{"B": "maybe"}`, ptr: new(B), err: errors.New(`json: invalid use of ,string struct tag, trying to unmarshal "maybe" into bool`)},
    792 	{in: `{"B": "tru"}`, ptr: new(B), err: errors.New(`json: invalid use of ,string struct tag, trying to unmarshal "tru" into bool`)},
    793 	{in: `{"B": "False"}`, ptr: new(B), err: errors.New(`json: invalid use of ,string struct tag, trying to unmarshal "False" into bool`)},
    794 	{in: `{"B": "null"}`, ptr: new(B), out: B{false}},
    795 	{in: `{"B": "nul"}`, ptr: new(B), err: errors.New(`json: invalid use of ,string struct tag, trying to unmarshal "nul" into bool`)},
    796 }
    797 
    798 func TestMarshal(t *testing.T) {
    799 	b, err := Marshal(allValue)
    800 	if err != nil {
    801 		t.Fatalf("Marshal allValue: %v", err)
    802 	}
    803 	if string(b) != allValueCompact {
    804 		t.Errorf("Marshal allValueCompact")
    805 		diff(t, b, []byte(allValueCompact))
    806 		return
    807 	}
    808 
    809 	b, err = Marshal(pallValue)
    810 	if err != nil {
    811 		t.Fatalf("Marshal pallValue: %v", err)
    812 	}
    813 	if string(b) != pallValueCompact {
    814 		t.Errorf("Marshal pallValueCompact")
    815 		diff(t, b, []byte(pallValueCompact))
    816 		return
    817 	}
    818 }
    819 
    820 var badUTF8 = []struct {
    821 	in, out string
    822 }{
    823 	{"hello\xffworld", `"hello\ufffdworld"`},
    824 	{"", `""`},
    825 	{"\xff", `"\ufffd"`},
    826 	{"\xff\xff", `"\ufffd\ufffd"`},
    827 	{"a\xffb", `"a\ufffdb"`},
    828 	{"\xe6\x97\xa5\xe6\x9c\xac\xff\xaa\x9e", `"\ufffd\ufffd\ufffd"`},
    829 }
    830 
    831 func TestMarshalBadUTF8(t *testing.T) {
    832 	for _, tt := range badUTF8 {
    833 		b, err := Marshal(tt.in)
    834 		if string(b) != tt.out || err != nil {
    835 			t.Errorf("Marshal(%q) = %#q, %v, want %#q, nil", tt.in, b, err, tt.out)
    836 		}
    837 	}
    838 }
    839 
    840 func TestMarshalNumberZeroVal(t *testing.T) {
    841 	var n Number
    842 	out, err := Marshal(n)
    843 	if err != nil {
    844 		t.Fatal(err)
    845 	}
    846 	outStr := string(out)
    847 	if outStr != "0" {
    848 		t.Fatalf("Invalid zero val for Number: %q", outStr)
    849 	}
    850 }
    851 
    852 func TestMarshalEmbeds(t *testing.T) {
    853 	top := &Top{
    854 		Level0: 1,
    855 		Embed0: Embed0{
    856 			Level1b: 2,
    857 			Level1c: 3,
    858 		},
    859 		Embed0a: &Embed0a{
    860 			Level1a: 5,
    861 			Level1b: 6,
    862 		},
    863 		Embed0b: &Embed0b{
    864 			Level1a: 8,
    865 			Level1b: 9,
    866 			Level1c: 10,
    867 			Level1d: 11,
    868 			Level1e: 12,
    869 		},
    870 		Loop: Loop{
    871 			Loop1: 13,
    872 			Loop2: 14,
    873 		},
    874 		Embed0p: Embed0p{
    875 			Point: image.Point{X: 15, Y: 16},
    876 		},
    877 		Embed0q: Embed0q{
    878 			Point: Point{Z: 17},
    879 		},
    880 		embed: embed{
    881 			Q: 18,
    882 		},
    883 	}
    884 	b, err := Marshal(top)
    885 	if err != nil {
    886 		t.Fatal(err)
    887 	}
    888 	want := "{\"Level0\":1,\"Level1b\":2,\"Level1c\":3,\"Level1a\":5,\"LEVEL1B\":6,\"e\":{\"Level1a\":8,\"Level1b\":9,\"Level1c\":10,\"Level1d\":11,\"x\":12},\"Loop1\":13,\"Loop2\":14,\"X\":15,\"Y\":16,\"Z\":17,\"Q\":18}"
    889 	if string(b) != want {
    890 		t.Errorf("Wrong marshal result.\n got: %q\nwant: %q", b, want)
    891 	}
    892 }
    893 
    894 func TestUnmarshal(t *testing.T) {
    895 	for i, tt := range unmarshalTests {
    896 		var scan scanner
    897 		in := []byte(tt.in)
    898 		if err := checkValid(in, &scan); err != nil {
    899 			if !reflect.DeepEqual(err, tt.err) {
    900 				t.Errorf("#%d: checkValid: %#v", i, err)
    901 				continue
    902 			}
    903 		}
    904 		if tt.ptr == nil {
    905 			continue
    906 		}
    907 
    908 		// v = new(right-type)
    909 		v := reflect.New(reflect.TypeOf(tt.ptr).Elem())
    910 		dec := NewDecoder(bytes.NewReader(in))
    911 		if tt.useNumber {
    912 			dec.UseNumber()
    913 		}
    914 		if err := dec.Decode(v.Interface()); !reflect.DeepEqual(err, tt.err) {
    915 			t.Errorf("#%d: %v, want %v", i, err, tt.err)
    916 			continue
    917 		} else if err != nil {
    918 			continue
    919 		}
    920 		if !reflect.DeepEqual(v.Elem().Interface(), tt.out) {
    921 			t.Errorf("#%d: mismatch\nhave: %#+v\nwant: %#+v", i, v.Elem().Interface(), tt.out)
    922 			data, _ := Marshal(v.Elem().Interface())
    923 			println(string(data))
    924 			data, _ = Marshal(tt.out)
    925 			println(string(data))
    926 			continue
    927 		}
    928 
    929 		// Check round trip also decodes correctly.
    930 		if tt.err == nil {
    931 			enc, err := Marshal(v.Interface())
    932 			if err != nil {
    933 				t.Errorf("#%d: error re-marshaling: %v", i, err)
    934 				continue
    935 			}
    936 			if tt.golden && !bytes.Equal(enc, in) {
    937 				t.Errorf("#%d: remarshal mismatch:\nhave: %s\nwant: %s", i, enc, in)
    938 			}
    939 			vv := reflect.New(reflect.TypeOf(tt.ptr).Elem())
    940 			dec = NewDecoder(bytes.NewReader(enc))
    941 			if tt.useNumber {
    942 				dec.UseNumber()
    943 			}
    944 			if err := dec.Decode(vv.Interface()); err != nil {
    945 				t.Errorf("#%d: error re-unmarshaling %#q: %v", i, enc, err)
    946 				continue
    947 			}
    948 			if !reflect.DeepEqual(v.Elem().Interface(), vv.Elem().Interface()) {
    949 				t.Errorf("#%d: mismatch\nhave: %#+v\nwant: %#+v", i, v.Elem().Interface(), vv.Elem().Interface())
    950 				t.Errorf("     In: %q", strings.Map(noSpace, string(in)))
    951 				t.Errorf("Marshal: %q", strings.Map(noSpace, string(enc)))
    952 				continue
    953 			}
    954 		}
    955 	}
    956 }
    957 
    958 func TestUnmarshalMarshal(t *testing.T) {
    959 	initBig()
    960 	var v interface{}
    961 	if err := Unmarshal(jsonBig, &v); err != nil {
    962 		t.Fatalf("Unmarshal: %v", err)
    963 	}
    964 	b, err := Marshal(v)
    965 	if err != nil {
    966 		t.Fatalf("Marshal: %v", err)
    967 	}
    968 	if !bytes.Equal(jsonBig, b) {
    969 		t.Errorf("Marshal jsonBig")
    970 		diff(t, b, jsonBig)
    971 		return
    972 	}
    973 }
    974 
    975 var numberTests = []struct {
    976 	in       string
    977 	i        int64
    978 	intErr   string
    979 	f        float64
    980 	floatErr string
    981 }{
    982 	{in: "-1.23e1", intErr: "strconv.ParseInt: parsing \"-1.23e1\": invalid syntax", f: -1.23e1},
    983 	{in: "-12", i: -12, f: -12.0},
    984 	{in: "1e1000", intErr: "strconv.ParseInt: parsing \"1e1000\": invalid syntax", floatErr: "strconv.ParseFloat: parsing \"1e1000\": value out of range"},
    985 }
    986 
    987 // Independent of Decode, basic coverage of the accessors in Number
    988 func TestNumberAccessors(t *testing.T) {
    989 	for _, tt := range numberTests {
    990 		n := Number(tt.in)
    991 		if s := n.String(); s != tt.in {
    992 			t.Errorf("Number(%q).String() is %q", tt.in, s)
    993 		}
    994 		if i, err := n.Int64(); err == nil && tt.intErr == "" && i != tt.i {
    995 			t.Errorf("Number(%q).Int64() is %d", tt.in, i)
    996 		} else if (err == nil && tt.intErr != "") || (err != nil && err.Error() != tt.intErr) {
    997 			t.Errorf("Number(%q).Int64() wanted error %q but got: %v", tt.in, tt.intErr, err)
    998 		}
    999 		if f, err := n.Float64(); err == nil && tt.floatErr == "" && f != tt.f {
   1000 			t.Errorf("Number(%q).Float64() is %g", tt.in, f)
   1001 		} else if (err == nil && tt.floatErr != "") || (err != nil && err.Error() != tt.floatErr) {
   1002 			t.Errorf("Number(%q).Float64() wanted error %q but got: %v", tt.in, tt.floatErr, err)
   1003 		}
   1004 	}
   1005 }
   1006 
   1007 func TestLargeByteSlice(t *testing.T) {
   1008 	s0 := make([]byte, 2000)
   1009 	for i := range s0 {
   1010 		s0[i] = byte(i)
   1011 	}
   1012 	b, err := Marshal(s0)
   1013 	if err != nil {
   1014 		t.Fatalf("Marshal: %v", err)
   1015 	}
   1016 	var s1 []byte
   1017 	if err := Unmarshal(b, &s1); err != nil {
   1018 		t.Fatalf("Unmarshal: %v", err)
   1019 	}
   1020 	if !bytes.Equal(s0, s1) {
   1021 		t.Errorf("Marshal large byte slice")
   1022 		diff(t, s0, s1)
   1023 	}
   1024 }
   1025 
   1026 type Xint struct {
   1027 	X int
   1028 }
   1029 
   1030 func TestUnmarshalInterface(t *testing.T) {
   1031 	var xint Xint
   1032 	var i interface{} = &xint
   1033 	if err := Unmarshal([]byte(`{"X":1}`), &i); err != nil {
   1034 		t.Fatalf("Unmarshal: %v", err)
   1035 	}
   1036 	if xint.X != 1 {
   1037 		t.Fatalf("Did not write to xint")
   1038 	}
   1039 }
   1040 
   1041 func TestUnmarshalPtrPtr(t *testing.T) {
   1042 	var xint Xint
   1043 	pxint := &xint
   1044 	if err := Unmarshal([]byte(`{"X":1}`), &pxint); err != nil {
   1045 		t.Fatalf("Unmarshal: %v", err)
   1046 	}
   1047 	if xint.X != 1 {
   1048 		t.Fatalf("Did not write to xint")
   1049 	}
   1050 }
   1051 
   1052 func TestEscape(t *testing.T) {
   1053 	const input = `"foobar"<html>` + " [\u2028 \u2029]"
   1054 	const expected = `"\"foobar\"\u003chtml\u003e [\u2028 \u2029]"`
   1055 	b, err := Marshal(input)
   1056 	if err != nil {
   1057 		t.Fatalf("Marshal error: %v", err)
   1058 	}
   1059 	if s := string(b); s != expected {
   1060 		t.Errorf("Encoding of [%s]:\n got [%s]\nwant [%s]", input, s, expected)
   1061 	}
   1062 }
   1063 
   1064 // WrongString is a struct that's misusing the ,string modifier.
   1065 type WrongString struct {
   1066 	Message string `json:"result,string"`
   1067 }
   1068 
   1069 type wrongStringTest struct {
   1070 	in, err string
   1071 }
   1072 
   1073 var wrongStringTests = []wrongStringTest{
   1074 	{`{"result":"x"}`, `json: invalid use of ,string struct tag, trying to unmarshal "x" into string`},
   1075 	{`{"result":"foo"}`, `json: invalid use of ,string struct tag, trying to unmarshal "foo" into string`},
   1076 	{`{"result":"123"}`, `json: invalid use of ,string struct tag, trying to unmarshal "123" into string`},
   1077 	{`{"result":123}`, `json: invalid use of ,string struct tag, trying to unmarshal unquoted value into string`},
   1078 }
   1079 
   1080 // If people misuse the ,string modifier, the error message should be
   1081 // helpful, telling the user that they're doing it wrong.
   1082 func TestErrorMessageFromMisusedString(t *testing.T) {
   1083 	for n, tt := range wrongStringTests {
   1084 		r := strings.NewReader(tt.in)
   1085 		var s WrongString
   1086 		err := NewDecoder(r).Decode(&s)
   1087 		got := fmt.Sprintf("%v", err)
   1088 		if got != tt.err {
   1089 			t.Errorf("%d. got err = %q, want %q", n, got, tt.err)
   1090 		}
   1091 	}
   1092 }
   1093 
   1094 func noSpace(c rune) rune {
   1095 	if isSpace(byte(c)) { //only used for ascii
   1096 		return -1
   1097 	}
   1098 	return c
   1099 }
   1100 
   1101 type All struct {
   1102 	Bool    bool
   1103 	Int     int
   1104 	Int8    int8
   1105 	Int16   int16
   1106 	Int32   int32
   1107 	Int64   int64
   1108 	Uint    uint
   1109 	Uint8   uint8
   1110 	Uint16  uint16
   1111 	Uint32  uint32
   1112 	Uint64  uint64
   1113 	Uintptr uintptr
   1114 	Float32 float32
   1115 	Float64 float64
   1116 
   1117 	Foo  string `json:"bar"`
   1118 	Foo2 string `json:"bar2,dummyopt"`
   1119 
   1120 	IntStr int64 `json:",string"`
   1121 
   1122 	PBool    *bool
   1123 	PInt     *int
   1124 	PInt8    *int8
   1125 	PInt16   *int16
   1126 	PInt32   *int32
   1127 	PInt64   *int64
   1128 	PUint    *uint
   1129 	PUint8   *uint8
   1130 	PUint16  *uint16
   1131 	PUint32  *uint32
   1132 	PUint64  *uint64
   1133 	PUintptr *uintptr
   1134 	PFloat32 *float32
   1135 	PFloat64 *float64
   1136 
   1137 	String  string
   1138 	PString *string
   1139 
   1140 	Map   map[string]Small
   1141 	MapP  map[string]*Small
   1142 	PMap  *map[string]Small
   1143 	PMapP *map[string]*Small
   1144 
   1145 	EmptyMap map[string]Small
   1146 	NilMap   map[string]Small
   1147 
   1148 	Slice   []Small
   1149 	SliceP  []*Small
   1150 	PSlice  *[]Small
   1151 	PSliceP *[]*Small
   1152 
   1153 	EmptySlice []Small
   1154 	NilSlice   []Small
   1155 
   1156 	StringSlice []string
   1157 	ByteSlice   []byte
   1158 
   1159 	Small   Small
   1160 	PSmall  *Small
   1161 	PPSmall **Small
   1162 
   1163 	Interface  interface{}
   1164 	PInterface *interface{}
   1165 
   1166 	unexported int
   1167 }
   1168 
   1169 type Small struct {
   1170 	Tag string
   1171 }
   1172 
   1173 var allValue = All{
   1174 	Bool:    true,
   1175 	Int:     2,
   1176 	Int8:    3,
   1177 	Int16:   4,
   1178 	Int32:   5,
   1179 	Int64:   6,
   1180 	Uint:    7,
   1181 	Uint8:   8,
   1182 	Uint16:  9,
   1183 	Uint32:  10,
   1184 	Uint64:  11,
   1185 	Uintptr: 12,
   1186 	Float32: 14.1,
   1187 	Float64: 15.1,
   1188 	Foo:     "foo",
   1189 	Foo2:    "foo2",
   1190 	IntStr:  42,
   1191 	String:  "16",
   1192 	Map: map[string]Small{
   1193 		"17": {Tag: "tag17"},
   1194 		"18": {Tag: "tag18"},
   1195 	},
   1196 	MapP: map[string]*Small{
   1197 		"19": {Tag: "tag19"},
   1198 		"20": nil,
   1199 	},
   1200 	EmptyMap:    map[string]Small{},
   1201 	Slice:       []Small{{Tag: "tag20"}, {Tag: "tag21"}},
   1202 	SliceP:      []*Small{{Tag: "tag22"}, nil, {Tag: "tag23"}},
   1203 	EmptySlice:  []Small{},
   1204 	StringSlice: []string{"str24", "str25", "str26"},
   1205 	ByteSlice:   []byte{27, 28, 29},
   1206 	Small:       Small{Tag: "tag30"},
   1207 	PSmall:      &Small{Tag: "tag31"},
   1208 	Interface:   5.2,
   1209 }
   1210 
   1211 var pallValue = All{
   1212 	PBool:      &allValue.Bool,
   1213 	PInt:       &allValue.Int,
   1214 	PInt8:      &allValue.Int8,
   1215 	PInt16:     &allValue.Int16,
   1216 	PInt32:     &allValue.Int32,
   1217 	PInt64:     &allValue.Int64,
   1218 	PUint:      &allValue.Uint,
   1219 	PUint8:     &allValue.Uint8,
   1220 	PUint16:    &allValue.Uint16,
   1221 	PUint32:    &allValue.Uint32,
   1222 	PUint64:    &allValue.Uint64,
   1223 	PUintptr:   &allValue.Uintptr,
   1224 	PFloat32:   &allValue.Float32,
   1225 	PFloat64:   &allValue.Float64,
   1226 	PString:    &allValue.String,
   1227 	PMap:       &allValue.Map,
   1228 	PMapP:      &allValue.MapP,
   1229 	PSlice:     &allValue.Slice,
   1230 	PSliceP:    &allValue.SliceP,
   1231 	PPSmall:    &allValue.PSmall,
   1232 	PInterface: &allValue.Interface,
   1233 }
   1234 
   1235 var allValueIndent = `{
   1236 	"Bool": true,
   1237 	"Int": 2,
   1238 	"Int8": 3,
   1239 	"Int16": 4,
   1240 	"Int32": 5,
   1241 	"Int64": 6,
   1242 	"Uint": 7,
   1243 	"Uint8": 8,
   1244 	"Uint16": 9,
   1245 	"Uint32": 10,
   1246 	"Uint64": 11,
   1247 	"Uintptr": 12,
   1248 	"Float32": 14.1,
   1249 	"Float64": 15.1,
   1250 	"bar": "foo",
   1251 	"bar2": "foo2",
   1252 	"IntStr": "42",
   1253 	"PBool": null,
   1254 	"PInt": null,
   1255 	"PInt8": null,
   1256 	"PInt16": null,
   1257 	"PInt32": null,
   1258 	"PInt64": null,
   1259 	"PUint": null,
   1260 	"PUint8": null,
   1261 	"PUint16": null,
   1262 	"PUint32": null,
   1263 	"PUint64": null,
   1264 	"PUintptr": null,
   1265 	"PFloat32": null,
   1266 	"PFloat64": null,
   1267 	"String": "16",
   1268 	"PString": null,
   1269 	"Map": {
   1270 		"17": {
   1271 			"Tag": "tag17"
   1272 		},
   1273 		"18": {
   1274 			"Tag": "tag18"
   1275 		}
   1276 	},
   1277 	"MapP": {
   1278 		"19": {
   1279 			"Tag": "tag19"
   1280 		},
   1281 		"20": null
   1282 	},
   1283 	"PMap": null,
   1284 	"PMapP": null,
   1285 	"EmptyMap": {},
   1286 	"NilMap": null,
   1287 	"Slice": [
   1288 		{
   1289 			"Tag": "tag20"
   1290 		},
   1291 		{
   1292 			"Tag": "tag21"
   1293 		}
   1294 	],
   1295 	"SliceP": [
   1296 		{
   1297 			"Tag": "tag22"
   1298 		},
   1299 		null,
   1300 		{
   1301 			"Tag": "tag23"
   1302 		}
   1303 	],
   1304 	"PSlice": null,
   1305 	"PSliceP": null,
   1306 	"EmptySlice": [],
   1307 	"NilSlice": null,
   1308 	"StringSlice": [
   1309 		"str24",
   1310 		"str25",
   1311 		"str26"
   1312 	],
   1313 	"ByteSlice": "Gxwd",
   1314 	"Small": {
   1315 		"Tag": "tag30"
   1316 	},
   1317 	"PSmall": {
   1318 		"Tag": "tag31"
   1319 	},
   1320 	"PPSmall": null,
   1321 	"Interface": 5.2,
   1322 	"PInterface": null
   1323 }`
   1324 
   1325 var allValueCompact = strings.Map(noSpace, allValueIndent)
   1326 
   1327 var pallValueIndent = `{
   1328 	"Bool": false,
   1329 	"Int": 0,
   1330 	"Int8": 0,
   1331 	"Int16": 0,
   1332 	"Int32": 0,
   1333 	"Int64": 0,
   1334 	"Uint": 0,
   1335 	"Uint8": 0,
   1336 	"Uint16": 0,
   1337 	"Uint32": 0,
   1338 	"Uint64": 0,
   1339 	"Uintptr": 0,
   1340 	"Float32": 0,
   1341 	"Float64": 0,
   1342 	"bar": "",
   1343 	"bar2": "",
   1344         "IntStr": "0",
   1345 	"PBool": true,
   1346 	"PInt": 2,
   1347 	"PInt8": 3,
   1348 	"PInt16": 4,
   1349 	"PInt32": 5,
   1350 	"PInt64": 6,
   1351 	"PUint": 7,
   1352 	"PUint8": 8,
   1353 	"PUint16": 9,
   1354 	"PUint32": 10,
   1355 	"PUint64": 11,
   1356 	"PUintptr": 12,
   1357 	"PFloat32": 14.1,
   1358 	"PFloat64": 15.1,
   1359 	"String": "",
   1360 	"PString": "16",
   1361 	"Map": null,
   1362 	"MapP": null,
   1363 	"PMap": {
   1364 		"17": {
   1365 			"Tag": "tag17"
   1366 		},
   1367 		"18": {
   1368 			"Tag": "tag18"
   1369 		}
   1370 	},
   1371 	"PMapP": {
   1372 		"19": {
   1373 			"Tag": "tag19"
   1374 		},
   1375 		"20": null
   1376 	},
   1377 	"EmptyMap": null,
   1378 	"NilMap": null,
   1379 	"Slice": null,
   1380 	"SliceP": null,
   1381 	"PSlice": [
   1382 		{
   1383 			"Tag": "tag20"
   1384 		},
   1385 		{
   1386 			"Tag": "tag21"
   1387 		}
   1388 	],
   1389 	"PSliceP": [
   1390 		{
   1391 			"Tag": "tag22"
   1392 		},
   1393 		null,
   1394 		{
   1395 			"Tag": "tag23"
   1396 		}
   1397 	],
   1398 	"EmptySlice": null,
   1399 	"NilSlice": null,
   1400 	"StringSlice": null,
   1401 	"ByteSlice": null,
   1402 	"Small": {
   1403 		"Tag": ""
   1404 	},
   1405 	"PSmall": null,
   1406 	"PPSmall": {
   1407 		"Tag": "tag31"
   1408 	},
   1409 	"Interface": null,
   1410 	"PInterface": 5.2
   1411 }`
   1412 
   1413 var pallValueCompact = strings.Map(noSpace, pallValueIndent)
   1414 
   1415 func TestRefUnmarshal(t *testing.T) {
   1416 	type S struct {
   1417 		// Ref is defined in encode_test.go.
   1418 		R0 Ref
   1419 		R1 *Ref
   1420 		R2 RefText
   1421 		R3 *RefText
   1422 	}
   1423 	want := S{
   1424 		R0: 12,
   1425 		R1: new(Ref),
   1426 		R2: 13,
   1427 		R3: new(RefText),
   1428 	}
   1429 	*want.R1 = 12
   1430 	*want.R3 = 13
   1431 
   1432 	var got S
   1433 	if err := Unmarshal([]byte(`{"R0":"ref","R1":"ref","R2":"ref","R3":"ref"}`), &got); err != nil {
   1434 		t.Fatalf("Unmarshal: %v", err)
   1435 	}
   1436 	if !reflect.DeepEqual(got, want) {
   1437 		t.Errorf("got %+v, want %+v", got, want)
   1438 	}
   1439 }
   1440 
   1441 // Test that the empty string doesn't panic decoding when ,string is specified
   1442 // Issue 3450
   1443 func TestEmptyString(t *testing.T) {
   1444 	type T2 struct {
   1445 		Number1 int `json:",string"`
   1446 		Number2 int `json:",string"`
   1447 	}
   1448 	data := `{"Number1":"1", "Number2":""}`
   1449 	dec := NewDecoder(strings.NewReader(data))
   1450 	var t2 T2
   1451 	err := dec.Decode(&t2)
   1452 	if err == nil {
   1453 		t.Fatal("Decode: did not return error")
   1454 	}
   1455 	if t2.Number1 != 1 {
   1456 		t.Fatal("Decode: did not set Number1")
   1457 	}
   1458 }
   1459 
   1460 // Test that a null for ,string is not replaced with the previous quoted string (issue 7046).
   1461 // It should also not be an error (issue 2540, issue 8587).
   1462 func TestNullString(t *testing.T) {
   1463 	type T struct {
   1464 		A int  `json:",string"`
   1465 		B int  `json:",string"`
   1466 		C *int `json:",string"`
   1467 	}
   1468 	data := []byte(`{"A": "1", "B": null, "C": null}`)
   1469 	var s T
   1470 	s.B = 1
   1471 	s.C = new(int)
   1472 	*s.C = 2
   1473 	err := Unmarshal(data, &s)
   1474 	if err != nil {
   1475 		t.Fatalf("Unmarshal: %v", err)
   1476 	}
   1477 	if s.B != 1 || s.C != nil {
   1478 		t.Fatalf("after Unmarshal, s.B=%d, s.C=%p, want 1, nil", s.B, s.C)
   1479 	}
   1480 }
   1481 
   1482 func intp(x int) *int {
   1483 	p := new(int)
   1484 	*p = x
   1485 	return p
   1486 }
   1487 
   1488 func intpp(x *int) **int {
   1489 	pp := new(*int)
   1490 	*pp = x
   1491 	return pp
   1492 }
   1493 
   1494 var interfaceSetTests = []struct {
   1495 	pre  interface{}
   1496 	json string
   1497 	post interface{}
   1498 }{
   1499 	{"foo", `"bar"`, "bar"},
   1500 	{"foo", `2`, 2.0},
   1501 	{"foo", `true`, true},
   1502 	{"foo", `null`, nil},
   1503 
   1504 	{nil, `null`, nil},
   1505 	{new(int), `null`, nil},
   1506 	{(*int)(nil), `null`, nil},
   1507 	{new(*int), `null`, new(*int)},
   1508 	{(**int)(nil), `null`, nil},
   1509 	{intp(1), `null`, nil},
   1510 	{intpp(nil), `null`, intpp(nil)},
   1511 	{intpp(intp(1)), `null`, intpp(nil)},
   1512 }
   1513 
   1514 func TestInterfaceSet(t *testing.T) {
   1515 	for _, tt := range interfaceSetTests {
   1516 		b := struct{ X interface{} }{tt.pre}
   1517 		blob := `{"X":` + tt.json + `}`
   1518 		if err := Unmarshal([]byte(blob), &b); err != nil {
   1519 			t.Errorf("Unmarshal %#q: %v", blob, err)
   1520 			continue
   1521 		}
   1522 		if !reflect.DeepEqual(b.X, tt.post) {
   1523 			t.Errorf("Unmarshal %#q into %#v: X=%#v, want %#v", blob, tt.pre, b.X, tt.post)
   1524 		}
   1525 	}
   1526 }
   1527 
   1528 type NullTest struct {
   1529 	Bool      bool
   1530 	Int       int
   1531 	Int8      int8
   1532 	Int16     int16
   1533 	Int32     int32
   1534 	Int64     int64
   1535 	Uint      uint
   1536 	Uint8     uint8
   1537 	Uint16    uint16
   1538 	Uint32    uint32
   1539 	Uint64    uint64
   1540 	Float32   float32
   1541 	Float64   float64
   1542 	String    string
   1543 	PBool     *bool
   1544 	Map       map[string]string
   1545 	Slice     []string
   1546 	Interface interface{}
   1547 
   1548 	PRaw    *RawMessage
   1549 	PTime   *time.Time
   1550 	PBigInt *big.Int
   1551 	PText   *MustNotUnmarshalText
   1552 	PBuffer *bytes.Buffer // has methods, just not relevant ones
   1553 	PStruct *struct{}
   1554 
   1555 	Raw    RawMessage
   1556 	Time   time.Time
   1557 	BigInt big.Int
   1558 	Text   MustNotUnmarshalText
   1559 	Buffer bytes.Buffer
   1560 	Struct struct{}
   1561 }
   1562 
   1563 type NullTestStrings struct {
   1564 	Bool      bool              `json:",string"`
   1565 	Int       int               `json:",string"`
   1566 	Int8      int8              `json:",string"`
   1567 	Int16     int16             `json:",string"`
   1568 	Int32     int32             `json:",string"`
   1569 	Int64     int64             `json:",string"`
   1570 	Uint      uint              `json:",string"`
   1571 	Uint8     uint8             `json:",string"`
   1572 	Uint16    uint16            `json:",string"`
   1573 	Uint32    uint32            `json:",string"`
   1574 	Uint64    uint64            `json:",string"`
   1575 	Float32   float32           `json:",string"`
   1576 	Float64   float64           `json:",string"`
   1577 	String    string            `json:",string"`
   1578 	PBool     *bool             `json:",string"`
   1579 	Map       map[string]string `json:",string"`
   1580 	Slice     []string          `json:",string"`
   1581 	Interface interface{}       `json:",string"`
   1582 
   1583 	PRaw    *RawMessage           `json:",string"`
   1584 	PTime   *time.Time            `json:",string"`
   1585 	PBigInt *big.Int              `json:",string"`
   1586 	PText   *MustNotUnmarshalText `json:",string"`
   1587 	PBuffer *bytes.Buffer         `json:",string"`
   1588 	PStruct *struct{}             `json:",string"`
   1589 
   1590 	Raw    RawMessage           `json:",string"`
   1591 	Time   time.Time            `json:",string"`
   1592 	BigInt big.Int              `json:",string"`
   1593 	Text   MustNotUnmarshalText `json:",string"`
   1594 	Buffer bytes.Buffer         `json:",string"`
   1595 	Struct struct{}             `json:",string"`
   1596 }
   1597 
   1598 // JSON null values should be ignored for primitives and string values instead of resulting in an error.
   1599 // Issue 2540
   1600 func TestUnmarshalNulls(t *testing.T) {
   1601 	// Unmarshal docs:
   1602 	// The JSON null value unmarshals into an interface, map, pointer, or slice
   1603 	// by setting that Go value to nil. Because null is often used in JSON to mean
   1604 	// ``not present,'' unmarshaling a JSON null into any other Go type has no effect
   1605 	// on the value and produces no error.
   1606 
   1607 	jsonData := []byte(`{
   1608 				"Bool"    : null,
   1609 				"Int"     : null,
   1610 				"Int8"    : null,
   1611 				"Int16"   : null,
   1612 				"Int32"   : null,
   1613 				"Int64"   : null,
   1614 				"Uint"    : null,
   1615 				"Uint8"   : null,
   1616 				"Uint16"  : null,
   1617 				"Uint32"  : null,
   1618 				"Uint64"  : null,
   1619 				"Float32" : null,
   1620 				"Float64" : null,
   1621 				"String"  : null,
   1622 				"PBool": null,
   1623 				"Map": null,
   1624 				"Slice": null,
   1625 				"Interface": null,
   1626 				"PRaw": null,
   1627 				"PTime": null,
   1628 				"PBigInt": null,
   1629 				"PText": null,
   1630 				"PBuffer": null,
   1631 				"PStruct": null,
   1632 				"Raw": null,
   1633 				"Time": null,
   1634 				"BigInt": null,
   1635 				"Text": null,
   1636 				"Buffer": null,
   1637 				"Struct": null
   1638 			}`)
   1639 	nulls := NullTest{
   1640 		Bool:      true,
   1641 		Int:       2,
   1642 		Int8:      3,
   1643 		Int16:     4,
   1644 		Int32:     5,
   1645 		Int64:     6,
   1646 		Uint:      7,
   1647 		Uint8:     8,
   1648 		Uint16:    9,
   1649 		Uint32:    10,
   1650 		Uint64:    11,
   1651 		Float32:   12.1,
   1652 		Float64:   13.1,
   1653 		String:    "14",
   1654 		PBool:     new(bool),
   1655 		Map:       map[string]string{},
   1656 		Slice:     []string{},
   1657 		Interface: new(MustNotUnmarshalJSON),
   1658 		PRaw:      new(RawMessage),
   1659 		PTime:     new(time.Time),
   1660 		PBigInt:   new(big.Int),
   1661 		PText:     new(MustNotUnmarshalText),
   1662 		PStruct:   new(struct{}),
   1663 		PBuffer:   new(bytes.Buffer),
   1664 		Raw:       RawMessage("123"),
   1665 		Time:      time.Unix(123456789, 0),
   1666 		BigInt:    *big.NewInt(123),
   1667 	}
   1668 
   1669 	before := nulls.Time.String()
   1670 
   1671 	err := Unmarshal(jsonData, &nulls)
   1672 	if err != nil {
   1673 		t.Errorf("Unmarshal of null values failed: %v", err)
   1674 	}
   1675 	if !nulls.Bool || nulls.Int != 2 || nulls.Int8 != 3 || nulls.Int16 != 4 || nulls.Int32 != 5 || nulls.Int64 != 6 ||
   1676 		nulls.Uint != 7 || nulls.Uint8 != 8 || nulls.Uint16 != 9 || nulls.Uint32 != 10 || nulls.Uint64 != 11 ||
   1677 		nulls.Float32 != 12.1 || nulls.Float64 != 13.1 || nulls.String != "14" {
   1678 		t.Errorf("Unmarshal of null values affected primitives")
   1679 	}
   1680 
   1681 	if nulls.PBool != nil {
   1682 		t.Errorf("Unmarshal of null did not clear nulls.PBool")
   1683 	}
   1684 	if nulls.Map != nil {
   1685 		t.Errorf("Unmarshal of null did not clear nulls.Map")
   1686 	}
   1687 	if nulls.Slice != nil {
   1688 		t.Errorf("Unmarshal of null did not clear nulls.Slice")
   1689 	}
   1690 	if nulls.Interface != nil {
   1691 		t.Errorf("Unmarshal of null did not clear nulls.Interface")
   1692 	}
   1693 	if nulls.PRaw != nil {
   1694 		t.Errorf("Unmarshal of null did not clear nulls.PRaw")
   1695 	}
   1696 	if nulls.PTime != nil {
   1697 		t.Errorf("Unmarshal of null did not clear nulls.PTime")
   1698 	}
   1699 	if nulls.PBigInt != nil {
   1700 		t.Errorf("Unmarshal of null did not clear nulls.PBigInt")
   1701 	}
   1702 	if nulls.PText != nil {
   1703 		t.Errorf("Unmarshal of null did not clear nulls.PText")
   1704 	}
   1705 	if nulls.PBuffer != nil {
   1706 		t.Errorf("Unmarshal of null did not clear nulls.PBuffer")
   1707 	}
   1708 	if nulls.PStruct != nil {
   1709 		t.Errorf("Unmarshal of null did not clear nulls.PStruct")
   1710 	}
   1711 
   1712 	if string(nulls.Raw) != "null" {
   1713 		t.Errorf("Unmarshal of RawMessage null did not record null: %v", string(nulls.Raw))
   1714 	}
   1715 	if nulls.Time.String() != before {
   1716 		t.Errorf("Unmarshal of time.Time null set time to %v", nulls.Time.String())
   1717 	}
   1718 	if nulls.BigInt.String() != "123" {
   1719 		t.Errorf("Unmarshal of big.Int null set int to %v", nulls.BigInt.String())
   1720 	}
   1721 }
   1722 
   1723 type MustNotUnmarshalJSON struct{}
   1724 
   1725 func (x MustNotUnmarshalJSON) UnmarshalJSON(data []byte) error {
   1726 	return errors.New("MustNotUnmarshalJSON was used")
   1727 }
   1728 
   1729 type MustNotUnmarshalText struct{}
   1730 
   1731 func (x MustNotUnmarshalText) UnmarshalText(text []byte) error {
   1732 	return errors.New("MustNotUnmarshalText was used")
   1733 }
   1734 
   1735 func TestStringKind(t *testing.T) {
   1736 	type stringKind string
   1737 
   1738 	var m1, m2 map[stringKind]int
   1739 	m1 = map[stringKind]int{
   1740 		"foo": 42,
   1741 	}
   1742 
   1743 	data, err := Marshal(m1)
   1744 	if err != nil {
   1745 		t.Errorf("Unexpected error marshaling: %v", err)
   1746 	}
   1747 
   1748 	err = Unmarshal(data, &m2)
   1749 	if err != nil {
   1750 		t.Errorf("Unexpected error unmarshaling: %v", err)
   1751 	}
   1752 
   1753 	if !reflect.DeepEqual(m1, m2) {
   1754 		t.Error("Items should be equal after encoding and then decoding")
   1755 	}
   1756 }
   1757 
   1758 // Custom types with []byte as underlying type could not be marshaled
   1759 // and then unmarshaled.
   1760 // Issue 8962.
   1761 func TestByteKind(t *testing.T) {
   1762 	type byteKind []byte
   1763 
   1764 	a := byteKind("hello")
   1765 
   1766 	data, err := Marshal(a)
   1767 	if err != nil {
   1768 		t.Error(err)
   1769 	}
   1770 	var b byteKind
   1771 	err = Unmarshal(data, &b)
   1772 	if err != nil {
   1773 		t.Fatal(err)
   1774 	}
   1775 	if !reflect.DeepEqual(a, b) {
   1776 		t.Errorf("expected %v == %v", a, b)
   1777 	}
   1778 }
   1779 
   1780 // The fix for issue 8962 introduced a regression.
   1781 // Issue 12921.
   1782 func TestSliceOfCustomByte(t *testing.T) {
   1783 	type Uint8 uint8
   1784 
   1785 	a := []Uint8("hello")
   1786 
   1787 	data, err := Marshal(a)
   1788 	if err != nil {
   1789 		t.Fatal(err)
   1790 	}
   1791 	var b []Uint8
   1792 	err = Unmarshal(data, &b)
   1793 	if err != nil {
   1794 		t.Fatal(err)
   1795 	}
   1796 	if !reflect.DeepEqual(a, b) {
   1797 		t.Fatalf("expected %v == %v", a, b)
   1798 	}
   1799 }
   1800 
   1801 var decodeTypeErrorTests = []struct {
   1802 	dest interface{}
   1803 	src  string
   1804 }{
   1805 	{new(string), `{"user": "name"}`}, // issue 4628.
   1806 	{new(error), `{}`},                // issue 4222
   1807 	{new(error), `[]`},
   1808 	{new(error), `""`},
   1809 	{new(error), `123`},
   1810 	{new(error), `true`},
   1811 }
   1812 
   1813 func TestUnmarshalTypeError(t *testing.T) {
   1814 	for _, item := range decodeTypeErrorTests {
   1815 		err := Unmarshal([]byte(item.src), item.dest)
   1816 		if _, ok := err.(*UnmarshalTypeError); !ok {
   1817 			t.Errorf("expected type error for Unmarshal(%q, type %T): got %T",
   1818 				item.src, item.dest, err)
   1819 		}
   1820 	}
   1821 }
   1822 
   1823 var unmarshalSyntaxTests = []string{
   1824 	"tru",
   1825 	"fals",
   1826 	"nul",
   1827 	"123e",
   1828 	`"hello`,
   1829 	`[1,2,3`,
   1830 	`{"key":1`,
   1831 	`{"key":1,`,
   1832 }
   1833 
   1834 func TestUnmarshalSyntax(t *testing.T) {
   1835 	var x interface{}
   1836 	for _, src := range unmarshalSyntaxTests {
   1837 		err := Unmarshal([]byte(src), &x)
   1838 		if _, ok := err.(*SyntaxError); !ok {
   1839 			t.Errorf("expected syntax error for Unmarshal(%q): got %T", src, err)
   1840 		}
   1841 	}
   1842 }
   1843 
   1844 // Test handling of unexported fields that should be ignored.
   1845 // Issue 4660
   1846 type unexportedFields struct {
   1847 	Name string
   1848 	m    map[string]interface{} `json:"-"`
   1849 	m2   map[string]interface{} `json:"abcd"`
   1850 }
   1851 
   1852 func TestUnmarshalUnexported(t *testing.T) {
   1853 	input := `{"Name": "Bob", "m": {"x": 123}, "m2": {"y": 456}, "abcd": {"z": 789}}`
   1854 	want := &unexportedFields{Name: "Bob"}
   1855 
   1856 	out := &unexportedFields{}
   1857 	err := Unmarshal([]byte(input), out)
   1858 	if err != nil {
   1859 		t.Errorf("got error %v, expected nil", err)
   1860 	}
   1861 	if !reflect.DeepEqual(out, want) {
   1862 		t.Errorf("got %q, want %q", out, want)
   1863 	}
   1864 }
   1865 
   1866 // Time3339 is a time.Time which encodes to and from JSON
   1867 // as an RFC 3339 time in UTC.
   1868 type Time3339 time.Time
   1869 
   1870 func (t *Time3339) UnmarshalJSON(b []byte) error {
   1871 	if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
   1872 		return fmt.Errorf("types: failed to unmarshal non-string value %q as an RFC 3339 time", b)
   1873 	}
   1874 	tm, err := time.Parse(time.RFC3339, string(b[1:len(b)-1]))
   1875 	if err != nil {
   1876 		return err
   1877 	}
   1878 	*t = Time3339(tm)
   1879 	return nil
   1880 }
   1881 
   1882 func TestUnmarshalJSONLiteralError(t *testing.T) {
   1883 	var t3 Time3339
   1884 	err := Unmarshal([]byte(`"0000-00-00T00:00:00Z"`), &t3)
   1885 	if err == nil {
   1886 		t.Fatalf("expected error; got time %v", time.Time(t3))
   1887 	}
   1888 	if !strings.Contains(err.Error(), "range") {
   1889 		t.Errorf("got err = %v; want out of range error", err)
   1890 	}
   1891 }
   1892 
   1893 // Test that extra object elements in an array do not result in a
   1894 // "data changing underfoot" error.
   1895 // Issue 3717
   1896 func TestSkipArrayObjects(t *testing.T) {
   1897 	json := `[{}]`
   1898 	var dest [0]interface{}
   1899 
   1900 	err := Unmarshal([]byte(json), &dest)
   1901 	if err != nil {
   1902 		t.Errorf("got error %q, want nil", err)
   1903 	}
   1904 }
   1905 
   1906 // Test semantics of pre-filled struct fields and pre-filled map fields.
   1907 // Issue 4900.
   1908 func TestPrefilled(t *testing.T) {
   1909 	ptrToMap := func(m map[string]interface{}) *map[string]interface{} { return &m }
   1910 
   1911 	// Values here change, cannot reuse table across runs.
   1912 	var prefillTests = []struct {
   1913 		in  string
   1914 		ptr interface{}
   1915 		out interface{}
   1916 	}{
   1917 		{
   1918 			in:  `{"X": 1, "Y": 2}`,
   1919 			ptr: &XYZ{X: float32(3), Y: int16(4), Z: 1.5},
   1920 			out: &XYZ{X: float64(1), Y: float64(2), Z: 1.5},
   1921 		},
   1922 		{
   1923 			in:  `{"X": 1, "Y": 2}`,
   1924 			ptr: ptrToMap(map[string]interface{}{"X": float32(3), "Y": int16(4), "Z": 1.5}),
   1925 			out: ptrToMap(map[string]interface{}{"X": float64(1), "Y": float64(2), "Z": 1.5}),
   1926 		},
   1927 	}
   1928 
   1929 	for _, tt := range prefillTests {
   1930 		ptrstr := fmt.Sprintf("%v", tt.ptr)
   1931 		err := Unmarshal([]byte(tt.in), tt.ptr) // tt.ptr edited here
   1932 		if err != nil {
   1933 			t.Errorf("Unmarshal: %v", err)
   1934 		}
   1935 		if !reflect.DeepEqual(tt.ptr, tt.out) {
   1936 			t.Errorf("Unmarshal(%#q, %s): have %v, want %v", tt.in, ptrstr, tt.ptr, tt.out)
   1937 		}
   1938 	}
   1939 }
   1940 
   1941 var invalidUnmarshalTests = []struct {
   1942 	v    interface{}
   1943 	want string
   1944 }{
   1945 	{nil, "json: Unmarshal(nil)"},
   1946 	{struct{}{}, "json: Unmarshal(non-pointer struct {})"},
   1947 	{(*int)(nil), "json: Unmarshal(nil *int)"},
   1948 }
   1949 
   1950 func TestInvalidUnmarshal(t *testing.T) {
   1951 	buf := []byte(`{"a":"1"}`)
   1952 	for _, tt := range invalidUnmarshalTests {
   1953 		err := Unmarshal(buf, tt.v)
   1954 		if err == nil {
   1955 			t.Errorf("Unmarshal expecting error, got nil")
   1956 			continue
   1957 		}
   1958 		if got := err.Error(); got != tt.want {
   1959 			t.Errorf("Unmarshal = %q; want %q", got, tt.want)
   1960 		}
   1961 	}
   1962 }
   1963 
   1964 var invalidUnmarshalTextTests = []struct {
   1965 	v    interface{}
   1966 	want string
   1967 }{
   1968 	{nil, "json: Unmarshal(nil)"},
   1969 	{struct{}{}, "json: Unmarshal(non-pointer struct {})"},
   1970 	{(*int)(nil), "json: Unmarshal(nil *int)"},
   1971 	{new(net.IP), "json: cannot unmarshal number into Go value of type *net.IP"},
   1972 }
   1973 
   1974 func TestInvalidUnmarshalText(t *testing.T) {
   1975 	buf := []byte(`123`)
   1976 	for _, tt := range invalidUnmarshalTextTests {
   1977 		err := Unmarshal(buf, tt.v)
   1978 		if err == nil {
   1979 			t.Errorf("Unmarshal expecting error, got nil")
   1980 			continue
   1981 		}
   1982 		if got := err.Error(); got != tt.want {
   1983 			t.Errorf("Unmarshal = %q; want %q", got, tt.want)
   1984 		}
   1985 	}
   1986 }
   1987 
   1988 // Test that string option is ignored for invalid types.
   1989 // Issue 9812.
   1990 func TestInvalidStringOption(t *testing.T) {
   1991 	num := 0
   1992 	item := struct {
   1993 		T time.Time         `json:",string"`
   1994 		M map[string]string `json:",string"`
   1995 		S []string          `json:",string"`
   1996 		A [1]string         `json:",string"`
   1997 		I interface{}       `json:",string"`
   1998 		P *int              `json:",string"`
   1999 	}{M: make(map[string]string), S: make([]string, 0), I: num, P: &num}
   2000 
   2001 	data, err := Marshal(item)
   2002 	if err != nil {
   2003 		t.Fatalf("Marshal: %v", err)
   2004 	}
   2005 
   2006 	err = Unmarshal(data, &item)
   2007 	if err != nil {
   2008 		t.Fatalf("Unmarshal: %v", err)
   2009 	}
   2010 }
   2011