// literal consumes a literal from d.data[d.off-1:], decoding into the value v. // The first byte of the literal has been read already // (that's how the caller knows it's a literal). func (d *decodeState) literal(v reflect.Value) { // All bytes inside literal return scanContinue op code. start := d.off - 1 op := d.scanWhile(scanContinue) // Scan read one byte too far; back up. d.off-- d.scan.undo(op) item := d.data[start:d.off] // Check for unmarshaler. wantptr := item[0] == 'n' // null unmarshaler, pv := d.indirect(v, wantptr) if unmarshaler != nil { err := unmarshaler.UnmarshalJSON(item) if err != nil { d.error(err) } return } v = pv switch c := item[0]; c { case 'n': // null switch v.(type) { default: d.saveError(&UnmarshalTypeError{"null", v.Type()}) case *reflect.InterfaceValue, *reflect.PtrValue, *reflect.MapValue: v.SetValue(nil) } case 't', 'f': // true, false value := c == 't' switch v := v.(type) { default: d.saveError(&UnmarshalTypeError{"bool", v.Type()}) case *reflect.BoolValue: v.Set(value) case *reflect.InterfaceValue: v.Set(reflect.NewValue(value)) } case '"': // string s, ok := unquote(item) if !ok { d.error(errPhase) } switch v := v.(type) { default: d.saveError(&UnmarshalTypeError{"string", v.Type()}) case *reflect.StringValue: v.Set(s) case *reflect.InterfaceValue: v.Set(reflect.NewValue(s)) } default: // number if c != '-' && (c < '0' || c > '9') { d.error(errPhase) } s := string(item) switch v := v.(type) { default: d.error(&UnmarshalTypeError{"number", v.Type()}) case *reflect.InterfaceValue: n, err := strconv.Atof64(s) if err != nil { d.saveError(&UnmarshalTypeError{"number " + s, v.Type()}) break } v.Set(reflect.NewValue(n)) case *reflect.IntValue: n, err := strconv.Atoi64(s) if err != nil || v.Overflow(n) { d.saveError(&UnmarshalTypeError{"number " + s, v.Type()}) break } v.Set(n) case *reflect.UintValue: n, err := strconv.Atoui64(s) if err != nil || v.Overflow(n) { d.saveError(&UnmarshalTypeError{"number " + s, v.Type()}) break } v.Set(n) case *reflect.FloatValue: n, err := strconv.AtofN(s, v.Type().Bits()) if err != nil || v.Overflow(n) { d.saveError(&UnmarshalTypeError{"number " + s, v.Type()}) break } v.Set(n) } } }