github.com/neilotoole/jsoncolor@v0.6.0/decode.go (about) 1 package jsoncolor 2 3 import ( 4 "bytes" 5 "encoding" 6 "encoding/base64" 7 "encoding/json" 8 "fmt" 9 "math" 10 "reflect" 11 "strconv" 12 "time" 13 "unsafe" 14 ) 15 16 func (d decoder) decodeNull(b []byte, p unsafe.Pointer) ([]byte, error) { 17 if hasNullPrefix(b) { 18 return b[4:], nil 19 } 20 return inputError(b, nullType) 21 } 22 23 func (d decoder) decodeBool(b []byte, p unsafe.Pointer) ([]byte, error) { 24 switch { 25 case hasTruePrefix(b): 26 *(*bool)(p) = true 27 return b[4:], nil 28 29 case hasFalsePrefix(b): 30 *(*bool)(p) = false 31 return b[5:], nil 32 33 case hasNullPrefix(b): 34 return b[4:], nil 35 36 default: 37 return inputError(b, boolType) 38 } 39 } 40 41 func (d decoder) decodeInt(b []byte, p unsafe.Pointer) ([]byte, error) { 42 if hasNullPrefix(b) { 43 return b[4:], nil 44 } 45 46 v, r, err := parseInt(b, intType) 47 if err != nil { 48 return r, err 49 } 50 51 *(*int)(p) = int(v) 52 return r, nil 53 } 54 55 func (d decoder) decodeInt8(b []byte, p unsafe.Pointer) ([]byte, error) { 56 if hasNullPrefix(b) { 57 return b[4:], nil 58 } 59 60 v, r, err := parseInt(b, int8Type) 61 if err != nil { 62 return r, err 63 } 64 65 if v < math.MinInt8 || v > math.MaxInt8 { 66 return r, unmarshalOverflow(b[:len(b)-len(r)], int8Type) 67 } 68 69 *(*int8)(p) = int8(v) 70 return r, nil 71 } 72 73 func (d decoder) decodeInt16(b []byte, p unsafe.Pointer) ([]byte, error) { 74 if hasNullPrefix(b) { 75 return b[4:], nil 76 } 77 78 v, r, err := parseInt(b, int16Type) 79 if err != nil { 80 return r, err 81 } 82 83 if v < math.MinInt16 || v > math.MaxInt16 { 84 return r, unmarshalOverflow(b[:len(b)-len(r)], int16Type) 85 } 86 87 *(*int16)(p) = int16(v) 88 return r, nil 89 } 90 91 func (d decoder) decodeInt32(b []byte, p unsafe.Pointer) ([]byte, error) { 92 if hasNullPrefix(b) { 93 return b[4:], nil 94 } 95 96 v, r, err := parseInt(b, int32Type) 97 if err != nil { 98 return r, err 99 } 100 101 if v < math.MinInt32 || v > math.MaxInt32 { 102 return r, unmarshalOverflow(b[:len(b)-len(r)], int32Type) 103 } 104 105 *(*int32)(p) = int32(v) 106 return r, nil 107 } 108 109 func (d decoder) decodeInt64(b []byte, p unsafe.Pointer) ([]byte, error) { 110 if hasNullPrefix(b) { 111 return b[4:], nil 112 } 113 114 v, r, err := parseInt(b, int64Type) 115 if err != nil { 116 return r, err 117 } 118 119 *(*int64)(p) = v 120 return r, nil 121 } 122 123 func (d decoder) decodeUint(b []byte, p unsafe.Pointer) ([]byte, error) { 124 if hasNullPrefix(b) { 125 return b[4:], nil 126 } 127 128 v, r, err := parseUint(b, uintType) 129 if err != nil { 130 return r, err 131 } 132 133 *(*uint)(p) = uint(v) 134 return r, nil 135 } 136 137 func (d decoder) decodeUintptr(b []byte, p unsafe.Pointer) ([]byte, error) { 138 if hasNullPrefix(b) { 139 return b[4:], nil 140 } 141 142 v, r, err := parseUint(b, uintptrType) 143 if err != nil { 144 return r, err 145 } 146 147 *(*uintptr)(p) = uintptr(v) 148 return r, nil 149 } 150 151 func (d decoder) decodeUint8(b []byte, p unsafe.Pointer) ([]byte, error) { 152 if hasNullPrefix(b) { 153 return b[4:], nil 154 } 155 156 v, r, err := parseUint(b, uint8Type) 157 if err != nil { 158 return r, err 159 } 160 161 if v > math.MaxUint8 { 162 return r, unmarshalOverflow(b[:len(b)-len(r)], uint8Type) 163 } 164 165 *(*uint8)(p) = uint8(v) 166 return r, nil 167 } 168 169 func (d decoder) decodeUint16(b []byte, p unsafe.Pointer) ([]byte, error) { 170 if hasNullPrefix(b) { 171 return b[4:], nil 172 } 173 174 v, r, err := parseUint(b, uint16Type) 175 if err != nil { 176 return r, err 177 } 178 179 if v > math.MaxUint16 { 180 return r, unmarshalOverflow(b[:len(b)-len(r)], uint16Type) 181 } 182 183 *(*uint16)(p) = uint16(v) 184 return r, nil 185 } 186 187 func (d decoder) decodeUint32(b []byte, p unsafe.Pointer) ([]byte, error) { 188 if hasNullPrefix(b) { 189 return b[4:], nil 190 } 191 192 v, r, err := parseUint(b, uint32Type) 193 if err != nil { 194 return r, err 195 } 196 197 if v > math.MaxUint32 { 198 return r, unmarshalOverflow(b[:len(b)-len(r)], uint32Type) 199 } 200 201 *(*uint32)(p) = uint32(v) 202 return r, nil 203 } 204 205 func (d decoder) decodeUint64(b []byte, p unsafe.Pointer) ([]byte, error) { 206 if hasNullPrefix(b) { 207 return b[4:], nil 208 } 209 210 v, r, err := parseUint(b, uint64Type) 211 if err != nil { 212 return r, err 213 } 214 215 *(*uint64)(p) = v 216 return r, nil 217 } 218 219 func (d decoder) decodeFloat32(b []byte, p unsafe.Pointer) ([]byte, error) { 220 if hasNullPrefix(b) { 221 return b[4:], nil 222 } 223 224 v, r, err := parseNumber(b) 225 if err != nil { 226 return inputError(b, float32Type) 227 } 228 229 f, err := strconv.ParseFloat(*(*string)(unsafe.Pointer(&v)), 32) 230 if err != nil { 231 return inputError(b, float32Type) 232 } 233 234 *(*float32)(p) = float32(f) 235 return r, nil 236 } 237 238 func (d decoder) decodeFloat64(b []byte, p unsafe.Pointer) ([]byte, error) { 239 if hasNullPrefix(b) { 240 return b[4:], nil 241 } 242 243 v, r, err := parseNumber(b) 244 if err != nil { 245 return inputError(b, float64Type) 246 } 247 248 f, err := strconv.ParseFloat(*(*string)(unsafe.Pointer(&v)), 64) 249 if err != nil { 250 return inputError(b, float64Type) 251 } 252 253 *(*float64)(p) = f 254 return r, nil 255 } 256 257 func (d decoder) decodeNumber(b []byte, p unsafe.Pointer) ([]byte, error) { 258 if hasNullPrefix(b) { 259 return b[4:], nil 260 } 261 262 v, r, err := parseNumber(b) 263 if err != nil { 264 return inputError(b, numberType) 265 } 266 267 if (d.flags & DontCopyNumber) != 0 { 268 *(*Number)(p) = *(*Number)(unsafe.Pointer(&v)) 269 } else { 270 *(*Number)(p) = Number(v) 271 } 272 273 return r, nil 274 } 275 276 func (d decoder) decodeString(b []byte, p unsafe.Pointer) ([]byte, error) { 277 if hasNullPrefix(b) { 278 return b[4:], nil 279 } 280 281 s, r, new, err := parseStringUnquote(b, nil) 282 if err != nil { 283 if len(b) == 0 || b[0] != '"' { 284 return inputError(b, stringType) 285 } 286 return r, err 287 } 288 289 if new || (d.flags&DontCopyString) != 0 { 290 *(*string)(p) = *(*string)(unsafe.Pointer(&s)) 291 } else { 292 *(*string)(p) = string(s) 293 } 294 295 return r, nil 296 } 297 298 func (d decoder) decodeFromString(b []byte, p unsafe.Pointer, decode decodeFunc) ([]byte, error) { 299 if hasNullPrefix(b) { 300 return decode(d, b, p) 301 } 302 303 v, b, _, err := parseStringUnquote(b, nil) 304 if err != nil { 305 return inputError(v, stringType) 306 } 307 308 if v, err = decode(d, v, p); err != nil { 309 return b, err 310 } 311 312 if v = skipSpaces(v); len(v) != 0 { 313 return b, syntaxError(v, "unexpected trailing tokens after string value") 314 } 315 316 return b, nil 317 } 318 319 func (d decoder) decodeFromStringToInt(b []byte, p unsafe.Pointer, t reflect.Type, decode decodeFunc) ([]byte, error) { 320 if hasPrefix(b, "null") { 321 return decode(d, b, p) 322 } 323 324 if len(b) > 0 && b[0] != '"' { 325 v, r, err := parseNumber(b) 326 if err == nil { 327 // The encoding/json package will return a *json.UnmarshalTypeError if 328 // the input was a floating point number representation, even tho a 329 // string is expected here. 330 isFloat := true 331 switch { 332 case bytes.IndexByte(v, '.') >= 0: 333 case bytes.IndexByte(v, 'e') >= 0: 334 case bytes.IndexByte(v, 'E') >= 0: 335 default: 336 isFloat = false 337 } 338 if isFloat { 339 _, err := strconv.ParseFloat(*(*string)(unsafe.Pointer(&v)), 64) 340 if err != nil { 341 return r, unmarshalTypeError(v, t) 342 } 343 } 344 } 345 return r, fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal unquoted value into int") 346 } 347 348 if len(b) > 1 && b[0] == '"' && b[1] == '"' { 349 return b, fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal \"\" into int") 350 } 351 352 v, b, _, err := parseStringUnquote(b, nil) 353 if err != nil { 354 return inputError(v, t) 355 } 356 357 if hasLeadingZeroes(v) { 358 // In this context the encoding/json package accepts leading zeroes because 359 // it is not constrained by the JSON syntax, remove them so the parsing 360 // functions don't return syntax errors. 361 u := make([]byte, 0, len(v)) 362 i := 0 363 364 if i < len(v) && v[i] == '-' || v[i] == '+' { 365 u = append(u, v[i]) 366 i++ 367 } 368 369 for (i+1) < len(v) && v[i] == '0' && '0' <= v[i+1] && v[i+1] <= '9' { 370 i++ 371 } 372 373 v = append(u, v[i:]...) 374 } 375 376 if r, err := decode(d, v, p); err != nil { 377 if _, isSyntaxError := err.(*SyntaxError); isSyntaxError { 378 if hasPrefix(v, "-") { 379 // The standard library interprets sequences of '-' characters 380 // as numbers but still returns type errors in this case... 381 return b, unmarshalTypeError(v, t) 382 } 383 return b, fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into int", prefix(v)) 384 } 385 // When the input value was a valid number representation we retain the 386 // error returned by the decoder. 387 if _, _, err := parseNumber(v); err != nil { 388 // When the input value valid JSON we mirror the behavior of the 389 // encoding/json package and return a generic error. 390 if _, _, err := parseValue(v); err == nil { 391 return b, fmt.Errorf("json: invalid use of ,string struct tag, trying to unmarshal %q into int", prefix(v)) 392 } 393 } 394 return b, err 395 } else if len(r) != 0 { 396 return r, unmarshalTypeError(v, t) 397 } 398 399 return b, nil 400 } 401 402 func (d decoder) decodeBytes(b []byte, p unsafe.Pointer) ([]byte, error) { 403 if hasNullPrefix(b) { 404 *(*[]byte)(p) = nil 405 return b[4:], nil 406 } 407 408 if len(b) < 2 { 409 return inputError(b, bytesType) 410 } 411 412 if b[0] != '"' { 413 // Go 1.7- behavior: bytes slices may be decoded from array of integers. 414 if len(b) > 0 && b[0] == '[' { 415 return d.decodeSlice(b, p, 1, bytesType, decoder.decodeUint8) 416 } 417 return inputError(b, bytesType) 418 } 419 420 // The input string contains escaped sequences, we need to parse it before 421 // decoding it to match the encoding/json package behvaior. 422 src, r, _, err := parseStringUnquote(b, nil) 423 if err != nil { 424 return inputError(b, bytesType) 425 } 426 427 dst := make([]byte, base64.StdEncoding.DecodedLen(len(src))) 428 429 n, err := base64.StdEncoding.Decode(dst, src) 430 if err != nil { 431 return r, err 432 } 433 434 *(*[]byte)(p) = dst[:n] 435 return r, nil 436 } 437 438 func (d decoder) decodeDuration(b []byte, p unsafe.Pointer) ([]byte, error) { 439 if hasNullPrefix(b) { 440 return b[4:], nil 441 } 442 443 // in order to inter-operate with the stdlib, we must be able to interpret 444 // durations passed as integer values. there's some discussion about being 445 // flexible on how durations are formatted, but for the time being, it's 446 // been punted to go2 at the earliest: https://github.com/golang/go/issues/4712 447 if len(b) > 0 && b[0] != '"' { 448 v, r, err := parseInt(b, durationType) 449 if err != nil { 450 return inputError(b, int32Type) 451 } 452 453 if v < math.MinInt64 || v > math.MaxInt64 { 454 return r, unmarshalOverflow(b[:len(b)-len(r)], int32Type) 455 } 456 457 *(*time.Duration)(p) = time.Duration(v) 458 return r, nil 459 } 460 461 if len(b) < 2 || b[0] != '"' { 462 return inputError(b, durationType) 463 } 464 465 i := bytes.IndexByte(b[1:], '"') + 1 466 if i <= 0 { 467 return inputError(b, durationType) 468 } 469 470 s := b[1:i] // trim quotes 471 472 v, err := time.ParseDuration(*(*string)(unsafe.Pointer(&s))) 473 if err != nil { 474 return inputError(b, durationType) 475 } 476 477 *(*time.Duration)(p) = v 478 return b[i+1:], nil 479 } 480 481 func (d decoder) decodeTime(b []byte, p unsafe.Pointer) ([]byte, error) { 482 if hasNullPrefix(b) { 483 return b[4:], nil 484 } 485 486 if len(b) < 2 || b[0] != '"' { 487 return inputError(b, timeType) 488 } 489 490 i := bytes.IndexByte(b[1:], '"') + 1 491 if i <= 0 { 492 return inputError(b, timeType) 493 } 494 495 s := b[1:i] // trim quotes 496 497 v, err := time.Parse(time.RFC3339Nano, *(*string)(unsafe.Pointer(&s))) 498 if err != nil { 499 return inputError(b, timeType) 500 } 501 502 *(*time.Time)(p) = v 503 return b[i+1:], nil 504 } 505 506 func (d decoder) decodeArray(b []byte, p unsafe.Pointer, n int, size uintptr, t reflect.Type, decode decodeFunc) ([]byte, error) { 507 if hasNullPrefix(b) { 508 return b[4:], nil 509 } 510 511 if len(b) < 2 || b[0] != '[' { 512 return inputError(b, t) 513 } 514 b = b[1:] 515 516 var err error 517 for i := 0; i < n; i++ { 518 b = skipSpaces(b) 519 520 if i != 0 { 521 if len(b) == 0 { 522 return b, syntaxError(b, "unexpected EOF after array element") 523 } 524 switch b[0] { 525 case ',': 526 b = skipSpaces(b[1:]) 527 case ']': 528 return b[1:], nil 529 default: 530 return b, syntaxError(b, "expected ',' after array element but found '%c'", b[0]) 531 } 532 } 533 534 b, err = decode(d, b, unsafe.Pointer(uintptr(p)+(uintptr(i)*size))) 535 if err != nil { 536 if e, ok := err.(*UnmarshalTypeError); ok { 537 e.Struct = t.String() + e.Struct 538 e.Field = strconv.Itoa(i) + "." + e.Field 539 } 540 return b, err 541 } 542 } 543 544 // The encoding/json package ignores extra elements found when decoding into 545 // array types (which have a fixed size). 546 for { 547 b = skipSpaces(b) 548 549 if len(b) == 0 { 550 return b, syntaxError(b, "missing closing ']' in array value") 551 } 552 553 switch b[0] { 554 case ',': 555 b = skipSpaces(b[1:]) 556 case ']': 557 return b[1:], nil 558 } 559 560 _, b, err = parseValue(b) 561 if err != nil { 562 return b, err 563 } 564 } 565 } 566 567 var ( 568 // This is a placeholder used to consturct non-nil empty slices. 569 empty struct{} 570 ) 571 572 func (d decoder) decodeSlice(b []byte, p unsafe.Pointer, size uintptr, t reflect.Type, decode decodeFunc) ([]byte, error) { 573 if hasNullPrefix(b) { 574 *(*slice)(p) = slice{} 575 return b[4:], nil 576 } 577 578 if len(b) < 2 { 579 return inputError(b, t) 580 } 581 582 if b[0] != '[' { 583 // Go 1.7- behavior: fallback to decoding as a []byte if the element 584 // type is byte; allow conversions from JSON strings even tho the 585 // underlying type implemented unmarshaler interfaces. 586 if t.Elem().Kind() == reflect.Uint8 { 587 return d.decodeBytes(b, p) 588 } 589 return inputError(b, t) 590 } 591 592 input := b 593 b = b[1:] 594 595 s := (*slice)(p) 596 s.len = 0 597 598 var err error 599 for { 600 b = skipSpaces(b) 601 602 if len(b) != 0 && b[0] == ']' { 603 if s.data == nil { 604 s.data = unsafe.Pointer(&empty) 605 } 606 return b[1:], nil 607 } 608 609 if s.len != 0 { 610 if len(b) == 0 { 611 return b, syntaxError(b, "unexpected EOF after array element") 612 } 613 if b[0] != ',' { 614 return b, syntaxError(b, "expected ',' after array element but found '%c'", b[0]) 615 } 616 b = skipSpaces(b[1:]) 617 } 618 619 if s.len == s.cap { 620 c := s.cap 621 622 if c == 0 { 623 c = 10 624 } else { 625 c *= 2 626 } 627 628 *s = extendSlice(t, s, c) 629 } 630 631 b, err = decode(d, b, unsafe.Pointer(uintptr(s.data)+(uintptr(s.len)*size))) 632 if err != nil { 633 if _, r, err := parseValue(input); err != nil { 634 return r, err 635 } else { 636 b = r 637 } 638 if e, ok := err.(*UnmarshalTypeError); ok { 639 e.Struct = t.String() + e.Struct 640 e.Field = strconv.Itoa(s.len) + "." + e.Field 641 } 642 return b, err 643 } 644 645 s.len++ 646 } 647 } 648 649 func (d decoder) decodeMap(b []byte, p unsafe.Pointer, t, kt, vt reflect.Type, kz, vz reflect.Value, decodeKey, decodeValue decodeFunc) ([]byte, error) { 650 if hasNullPrefix(b) { 651 *(*unsafe.Pointer)(p) = nil 652 return b[4:], nil 653 } 654 655 if len(b) < 2 || b[0] != '{' { 656 return inputError(b, t) 657 } 658 i := 0 659 m := reflect.NewAt(t, p).Elem() 660 661 k := reflect.New(kt).Elem() 662 v := reflect.New(vt).Elem() 663 664 kptr := (*iface)(unsafe.Pointer(&k)).ptr 665 vptr := (*iface)(unsafe.Pointer(&v)).ptr 666 input := b 667 668 if m.IsNil() { 669 m = reflect.MakeMap(t) 670 } 671 672 var err error 673 b = b[1:] 674 for { 675 k.Set(kz) 676 v.Set(vz) 677 b = skipSpaces(b) 678 679 if len(b) != 0 && b[0] == '}' { 680 *(*unsafe.Pointer)(p) = unsafe.Pointer(m.Pointer()) 681 return b[1:], nil 682 } 683 684 if i != 0 { 685 if len(b) == 0 { 686 return b, syntaxError(b, "unexpected end of JONS input after object field value") 687 } 688 if b[0] != ',' { 689 return b, syntaxError(b, "expected ',' after object field value but found '%c'", b[0]) 690 } 691 b = skipSpaces(b[1:]) 692 } 693 694 if hasPrefix(b, "null") { 695 return b, syntaxError(b, "cannot decode object key string from 'null' value") 696 } 697 698 if b, err = decodeKey(d, b, kptr); err != nil { 699 return objectKeyError(b, err) 700 } 701 b = skipSpaces(b) 702 703 if len(b) == 0 { 704 return b, syntaxError(b, "unexpected end of JSON input after object field key") 705 } 706 if b[0] != ':' { 707 return b, syntaxError(b, "expected ':' after object field key but found '%c'", b[0]) 708 } 709 b = skipSpaces(b[1:]) 710 711 if b, err = decodeValue(d, b, vptr); err != nil { 712 if _, r, err := parseValue(input); err != nil { 713 return r, err 714 } else { 715 b = r 716 } 717 if e, ok := err.(*UnmarshalTypeError); ok { 718 e.Struct = "map[" + kt.String() + "]" + vt.String() + "{" + e.Struct + "}" 719 e.Field = fmt.Sprint(k.Interface()) + "." + e.Field 720 } 721 return b, err 722 } 723 724 m.SetMapIndex(k, v) 725 i++ 726 } 727 } 728 729 func (d decoder) decodeMapStringInterface(b []byte, p unsafe.Pointer) ([]byte, error) { 730 if hasNullPrefix(b) { 731 *(*unsafe.Pointer)(p) = nil 732 return b[4:], nil 733 } 734 735 if len(b) < 2 || b[0] != '{' { 736 return inputError(b, mapStringInterfaceType) 737 } 738 739 i := 0 740 m := *(*map[string]interface{})(p) 741 742 if m == nil { 743 m = make(map[string]interface{}, 64) 744 } 745 746 var err error 747 var key string 748 var val interface{} 749 var input = b 750 751 b = b[1:] 752 for { 753 key = "" 754 val = nil 755 756 b = skipSpaces(b) 757 758 if len(b) != 0 && b[0] == '}' { 759 *(*unsafe.Pointer)(p) = *(*unsafe.Pointer)(unsafe.Pointer(&m)) 760 return b[1:], nil 761 } 762 763 if i != 0 { 764 if len(b) == 0 { 765 return b, syntaxError(b, "unexpected end of JSON input after object field value") 766 } 767 if b[0] != ',' { 768 return b, syntaxError(b, "expected ',' after object field value but found '%c'", b[0]) 769 } 770 b = skipSpaces(b[1:]) 771 } 772 773 if hasPrefix(b, "null") { 774 return b, syntaxError(b, "cannot decode object key string from 'null' value") 775 } 776 777 b, err = d.decodeString(b, unsafe.Pointer(&key)) 778 if err != nil { 779 return objectKeyError(b, err) 780 } 781 b = skipSpaces(b) 782 783 if len(b) == 0 { 784 return b, syntaxError(b, "unexpected end of JSON input after object field key") 785 } 786 if b[0] != ':' { 787 return b, syntaxError(b, "expected ':' after object field key but found '%c'", b[0]) 788 } 789 b = skipSpaces(b[1:]) 790 791 b, err = d.decodeInterface(b, unsafe.Pointer(&val)) 792 if err != nil { 793 if _, r, err := parseValue(input); err != nil { 794 return r, err 795 } else { 796 b = r 797 } 798 if e, ok := err.(*UnmarshalTypeError); ok { 799 e.Struct = mapStringInterfaceType.String() + e.Struct 800 e.Field = key + "." + e.Field 801 } 802 return b, err 803 } 804 805 m[key] = val 806 i++ 807 } 808 } 809 810 func (d decoder) decodeMapStringRawMessage(b []byte, p unsafe.Pointer) ([]byte, error) { 811 if hasNullPrefix(b) { 812 *(*unsafe.Pointer)(p) = nil 813 return b[4:], nil 814 } 815 816 if len(b) < 2 || b[0] != '{' { 817 return inputError(b, mapStringRawMessageType) 818 } 819 820 i := 0 821 m := *(*map[string]RawMessage)(p) 822 823 if m == nil { 824 m = make(map[string]RawMessage, 64) 825 } 826 827 var err error 828 var key string 829 var val RawMessage 830 var input = b 831 832 b = b[1:] 833 for { 834 key = "" 835 val = nil 836 837 b = skipSpaces(b) 838 839 if len(b) != 0 && b[0] == '}' { 840 *(*unsafe.Pointer)(p) = *(*unsafe.Pointer)(unsafe.Pointer(&m)) 841 return b[1:], nil 842 } 843 844 if i != 0 { 845 if len(b) == 0 { 846 return b, syntaxError(b, "unexpected end of JSON input after object field value") 847 } 848 if b[0] != ',' { 849 return b, syntaxError(b, "expected ',' after object field value but found '%c'", b[0]) 850 } 851 b = skipSpaces(b[1:]) 852 } 853 854 if hasPrefix(b, "null") { 855 return b, syntaxError(b, "cannot decode object key string from 'null' value") 856 } 857 858 b, err = d.decodeString(b, unsafe.Pointer(&key)) 859 if err != nil { 860 return objectKeyError(b, err) 861 } 862 b = skipSpaces(b) 863 864 if len(b) == 0 { 865 return b, syntaxError(b, "unexpected end of JSON input after object field key") 866 } 867 if b[0] != ':' { 868 return b, syntaxError(b, "expected ':' after object field key but found '%c'", b[0]) 869 } 870 b = skipSpaces(b[1:]) 871 872 b, err = d.decodeRawMessage(b, unsafe.Pointer(&val)) 873 if err != nil { 874 if _, r, err := parseValue(input); err != nil { 875 return r, err 876 } else { 877 b = r 878 } 879 if e, ok := err.(*UnmarshalTypeError); ok { 880 e.Struct = mapStringRawMessageType.String() + e.Struct 881 e.Field = key + "." + e.Field 882 } 883 return b, err 884 } 885 886 m[key] = val 887 i++ 888 } 889 } 890 891 func (d decoder) decodeStruct(b []byte, p unsafe.Pointer, st *structType) ([]byte, error) { 892 if hasNullPrefix(b) { 893 return b[4:], nil 894 } 895 896 if len(b) < 2 || b[0] != '{' { 897 return inputError(b, st.typ) 898 } 899 900 var err error 901 var k []byte 902 var i int 903 904 // memory buffer used to convert short field names to lowercase 905 var buf [64]byte 906 var key []byte 907 var input = b 908 909 b = b[1:] 910 for { 911 b = skipSpaces(b) 912 913 if len(b) != 0 && b[0] == '}' { 914 return b[1:], nil 915 } 916 917 if i != 0 { 918 if len(b) == 0 { 919 return b, syntaxError(b, "unexpected end of JSON input after object field value") 920 } 921 if b[0] != ',' { 922 return b, syntaxError(b, "expected ',' after object field value but found '%c'", b[0]) 923 } 924 b = skipSpaces(b[1:]) 925 } 926 i++ 927 928 if hasPrefix(b, "null") { 929 return b, syntaxError(b, "cannot decode object key string from 'null' value") 930 } 931 932 k, b, _, err = parseStringUnquote(b, nil) 933 if err != nil { 934 return objectKeyError(b, err) 935 } 936 b = skipSpaces(b) 937 938 if len(b) == 0 { 939 return b, syntaxError(b, "unexpected end of JSON input after object field key") 940 } 941 if b[0] != ':' { 942 return b, syntaxError(b, "expected ':' after object field key but found '%c'", b[0]) 943 } 944 b = skipSpaces(b[1:]) 945 946 f := st.fieldsIndex[string(k)] 947 948 if f == nil && (d.flags&DontMatchCaseInsensitiveStructFields) == 0 { 949 key = appendToLower(buf[:0], k) 950 f = st.ficaseIndex[string(key)] 951 } 952 953 if f == nil { 954 if (d.flags & DisallowUnknownFields) != 0 { 955 return b, fmt.Errorf("json: unknown field %q", k) 956 } 957 if _, b, err = parseValue(b); err != nil { 958 return b, err 959 } 960 continue 961 } 962 963 if b, err = f.codec.decode(d, b, unsafe.Pointer(uintptr(p)+f.offset)); err != nil { 964 if _, r, err := parseValue(input); err != nil { 965 return r, err 966 } else { 967 b = r 968 } 969 if e, ok := err.(*UnmarshalTypeError); ok { 970 e.Struct = st.typ.String() + e.Struct 971 e.Field = string(k) + "." + e.Field 972 } 973 return b, err 974 } 975 } 976 } 977 978 func (d decoder) decodeEmbeddedStructPointer(b []byte, p unsafe.Pointer, t reflect.Type, unexported bool, offset uintptr, decode decodeFunc) ([]byte, error) { 979 v := *(*unsafe.Pointer)(p) 980 981 if v == nil { 982 if unexported { 983 return nil, fmt.Errorf("json: cannot set embedded pointer to unexported struct: %s", t) 984 } 985 v = unsafe.Pointer(reflect.New(t).Pointer()) 986 *(*unsafe.Pointer)(p) = v 987 } 988 989 return decode(d, b, unsafe.Pointer(uintptr(v)+offset)) 990 } 991 992 func (d decoder) decodePointer(b []byte, p unsafe.Pointer, t reflect.Type, decode decodeFunc) ([]byte, error) { 993 if hasNullPrefix(b) { 994 pp := *(*unsafe.Pointer)(p) 995 if pp != nil && t.Kind() == reflect.Ptr { 996 return decode(d, b, pp) 997 } 998 *(*unsafe.Pointer)(p) = nil 999 return b[4:], nil 1000 } 1001 1002 v := *(*unsafe.Pointer)(p) 1003 if v == nil { 1004 v = unsafe.Pointer(reflect.New(t).Pointer()) 1005 *(*unsafe.Pointer)(p) = v 1006 } 1007 1008 return decode(d, b, v) 1009 } 1010 1011 func (d decoder) decodeInterface(b []byte, p unsafe.Pointer) ([]byte, error) { 1012 val := *(*interface{})(p) 1013 *(*interface{})(p) = nil 1014 1015 if t := reflect.TypeOf(val); t != nil && t.Kind() == reflect.Ptr { 1016 if v := reflect.ValueOf(val); v.IsNil() || t.Elem().Kind() != reflect.Ptr { 1017 // If the destination is nil the only value that is OK to decode is 1018 // `null`, and the encoding/json package always nils the destination 1019 // interface value in this case. 1020 if hasNullPrefix(b) { 1021 *(*interface{})(p) = nil 1022 return b[4:], nil 1023 } 1024 } 1025 1026 b, err := Parse(b, val, d.flags) 1027 if err == nil { 1028 *(*interface{})(p) = val 1029 } 1030 return b, err 1031 } 1032 1033 v, b, err := parseValue(b) 1034 if err != nil { 1035 return b, err 1036 } 1037 1038 switch v[0] { 1039 case '{': 1040 m := make(map[string]interface{}) 1041 v, err = d.decodeMapStringInterface(v, unsafe.Pointer(&m)) 1042 val = m 1043 1044 case '[': 1045 a := make([]interface{}, 0, 10) 1046 v, err = d.decodeSlice(v, unsafe.Pointer(&a), unsafe.Sizeof(a[0]), sliceInterfaceType, decoder.decodeInterface) 1047 val = a 1048 1049 case '"': 1050 s := "" 1051 v, err = d.decodeString(v, unsafe.Pointer(&s)) 1052 val = s 1053 1054 case 'n': 1055 v, err = d.decodeNull(v, nil) 1056 val = nil 1057 1058 case 't', 'f': 1059 x := false 1060 v, err = d.decodeBool(v, unsafe.Pointer(&x)) 1061 val = x 1062 1063 case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': 1064 if (d.flags & UseNumber) != 0 { 1065 n := Number("") 1066 v, err = d.decodeNumber(v, unsafe.Pointer(&n)) 1067 val = n 1068 } else { 1069 f := 0.0 1070 v, err = d.decodeFloat64(v, unsafe.Pointer(&f)) 1071 val = f 1072 } 1073 1074 default: 1075 return b, syntaxError(v, "expected token but found '%c'", v[0]) 1076 } 1077 1078 if err != nil { 1079 return b, err 1080 } 1081 1082 if v = skipSpaces(v); len(v) != 0 { 1083 return b, syntaxError(v, "unexpected trailing trailing tokens after json value") 1084 } 1085 1086 *(*interface{})(p) = val 1087 return b, nil 1088 } 1089 1090 func (d decoder) decodeMaybeEmptyInterface(b []byte, p unsafe.Pointer, t reflect.Type) ([]byte, error) { 1091 if hasNullPrefix(b) { 1092 *(*interface{})(p) = nil 1093 return b[4:], nil 1094 } 1095 1096 if x := reflect.NewAt(t, p).Elem(); !x.IsNil() { 1097 if e := x.Elem(); e.Kind() == reflect.Ptr { 1098 return Parse(b, e.Interface(), d.flags) 1099 } 1100 } else if t.NumMethod() == 0 { // empty interface 1101 return Parse(b, (*interface{})(p), d.flags) 1102 } 1103 1104 return d.decodeUnmarshalTypeError(b, p, t) 1105 } 1106 1107 func (d decoder) decodeUnmarshalTypeError(b []byte, p unsafe.Pointer, t reflect.Type) ([]byte, error) { 1108 v, b, err := parseValue(b) 1109 if err != nil { 1110 return b, err 1111 } 1112 return b, &UnmarshalTypeError{ 1113 Value: string(v), 1114 Type: t, 1115 } 1116 } 1117 1118 func (d decoder) decodeRawMessage(b []byte, p unsafe.Pointer) ([]byte, error) { 1119 v, r, err := parseValue(b) 1120 if err != nil { 1121 return inputError(b, rawMessageType) 1122 } 1123 1124 if (d.flags & DontCopyRawMessage) == 0 { 1125 v = append(make([]byte, 0, len(v)), v...) 1126 } 1127 1128 *(*RawMessage)(p) = json.RawMessage(v) 1129 return r, err 1130 } 1131 1132 func (d decoder) decodeJSONUnmarshaler(b []byte, p unsafe.Pointer, t reflect.Type, pointer bool) ([]byte, error) { 1133 v, b, err := parseValue(b) 1134 if err != nil { 1135 return b, err 1136 } 1137 1138 if len(v) != 0 && v[0] == 'n' { // null 1139 return b, nil 1140 } 1141 1142 u := reflect.NewAt(t, p) 1143 if !pointer { 1144 u = u.Elem() 1145 t = t.Elem() 1146 } 1147 if u.IsNil() { 1148 u.Set(reflect.New(t)) 1149 } 1150 return b, u.Interface().(Unmarshaler).UnmarshalJSON(v) 1151 } 1152 1153 func (d decoder) decodeTextUnmarshaler(b []byte, p unsafe.Pointer, t reflect.Type, pointer bool) ([]byte, error) { 1154 var value string 1155 1156 v, b, err := parseValue(b) 1157 if err != nil { 1158 return b, err 1159 } 1160 if len(v) == 0 { 1161 return inputError(v, t) 1162 } 1163 1164 switch v[0] { 1165 case 'n': 1166 _, _, err := parseNull(v) 1167 return b, err 1168 case '"': 1169 s, _, _, err := parseStringUnquote(v, nil) 1170 if err != nil { 1171 return b, err 1172 } 1173 u := reflect.NewAt(t, p) 1174 if !pointer { 1175 u = u.Elem() 1176 t = t.Elem() 1177 } 1178 if u.IsNil() { 1179 u.Set(reflect.New(t)) 1180 } 1181 return b, u.Interface().(encoding.TextUnmarshaler).UnmarshalText(s) 1182 case '{': 1183 value = "object" 1184 case '[': 1185 value = "array" 1186 case 't': 1187 value = "true" 1188 case 'f': 1189 value = "false" 1190 case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': 1191 value = "number" 1192 } 1193 1194 return b, &UnmarshalTypeError{Value: value, Type: reflect.PtrTo(t)} 1195 }