5 "github.com/modern-go/reflect2"
12 // String returns the literal text of the number.
13 func (n Number) String() string { return string(n) }
15 // Float64 returns the number as a float64.
16 func (n Number) Float64() (float64, error) {
17 return strconv.ParseFloat(string(n), 64)
20 // Int64 returns the number as an int64.
21 func (n Number) Int64() (int64, error) {
22 return strconv.ParseInt(string(n), 10, 64)
25 func CastJsonNumber(val interface{}) (string, bool) {
26 switch typedVal := val.(type) {
28 return string(typedVal), true
30 return string(typedVal), true
35 var jsonNumberType = reflect2.TypeOfPtr((*json.Number)(nil)).Elem()
36 var jsoniterNumberType = reflect2.TypeOfPtr((*Number)(nil)).Elem()
38 func createDecoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValDecoder {
39 if typ.AssignableTo(jsonNumberType) {
40 return &jsonNumberCodec{}
42 if typ.AssignableTo(jsoniterNumberType) {
43 return &jsoniterNumberCodec{}
48 func createEncoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValEncoder {
49 if typ.AssignableTo(jsonNumberType) {
50 return &jsonNumberCodec{}
52 if typ.AssignableTo(jsoniterNumberType) {
53 return &jsoniterNumberCodec{}
58 type jsonNumberCodec struct {
61 func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
62 switch iter.WhatIsNext() {
64 *((*json.Number)(ptr)) = json.Number(iter.ReadString())
66 iter.skipFourBytes('n', 'u', 'l', 'l')
67 *((*json.Number)(ptr)) = ""
69 *((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString()))
73 func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
74 number := *((*json.Number)(ptr))
78 stream.WriteRaw(string(number))
82 func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
83 return len(*((*json.Number)(ptr))) == 0
86 type jsoniterNumberCodec struct {
89 func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
90 switch iter.WhatIsNext() {
92 *((*Number)(ptr)) = Number(iter.ReadString())
94 iter.skipFourBytes('n', 'u', 'l', 'l')
95 *((*Number)(ptr)) = ""
97 *((*Number)(ptr)) = Number([]byte(iter.readNumberAsString()))
101 func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
102 number := *((*Number)(ptr))
103 if len(number) == 0 {
104 stream.writeByte('0')
106 stream.WriteRaw(string(number))
110 func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
111 return len(*((*Number)(ptr))) == 0