Skip to content
This repository was archived by the owner on Dec 15, 2025. It is now read-only.

Commit 6327145

Browse files
committed
move json number impl
1 parent c99d73a commit 6327145

File tree

4 files changed

+120
-103
lines changed

4 files changed

+120
-103
lines changed

json_number.go

Lines changed: 0 additions & 31 deletions
This file was deleted.

reflect.go

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@ type checkIsEmpty interface {
3636
IsEmpty(ptr unsafe.Pointer) bool
3737
}
3838

39-
var jsonNumberType reflect.Type
40-
var jsoniterNumberType reflect.Type
4139
var jsonRawMessageType reflect.Type
4240
var jsoniterRawMessageType reflect.Type
4341
var anyType reflect.Type
@@ -47,8 +45,6 @@ var textMarshalerType reflect.Type
4745
var textUnmarshalerType reflect.Type
4846

4947
func init() {
50-
jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem()
51-
jsoniterNumberType = reflect.TypeOf((*Number)(nil)).Elem()
5248
jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
5349
jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
5450
anyType = reflect.TypeOf((*Any)(nil)).Elem()
@@ -116,13 +112,11 @@ func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
116112
if typ == jsoniterRawMessageType {
117113
return &jsoniterRawMessageCodec{}
118114
}
119-
if typ.AssignableTo(jsonNumberType) {
120-
return &jsonNumberCodec{}
121-
}
122-
if typ.AssignableTo(jsoniterNumberType) {
123-
return &jsoniterNumberCodec{}
115+
decoder := createDecoderOfJsonNumber(cfg, prefix, typ)
116+
if decoder != nil {
117+
return decoder
124118
}
125-
decoder := createDecoderOfMarshaler(cfg, prefix, typ)
119+
decoder = createDecoderOfMarshaler(cfg, prefix, typ)
126120
if decoder != nil {
127121
return decoder
128122
}
@@ -307,13 +301,11 @@ func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
307301
if typ == jsoniterRawMessageType {
308302
return &jsoniterRawMessageCodec{}
309303
}
310-
if typ.AssignableTo(jsonNumberType) {
311-
return &jsonNumberCodec{}
312-
}
313-
if typ.AssignableTo(jsoniterNumberType) {
314-
return &jsoniterNumberCodec{}
304+
encoder := createEncoderOfJsonNumber(cfg, prefix, typ)
305+
if encoder != nil {
306+
return encoder
315307
}
316-
encoder := createEncoderOfMarshaler(cfg, prefix, typ)
308+
encoder = createEncoderOfMarshaler(cfg, prefix, typ)
317309
if encoder != nil {
318310
return encoder
319311
}

reflect_json_number.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package jsoniter
2+
3+
import (
4+
"encoding/json"
5+
"strconv"
6+
"unsafe"
7+
"reflect"
8+
)
9+
10+
type Number string
11+
12+
// String returns the literal text of the number.
13+
func (n Number) String() string { return string(n) }
14+
15+
// Float64 returns the number as a float64.
16+
func (n Number) Float64() (float64, error) {
17+
return strconv.ParseFloat(string(n), 64)
18+
}
19+
20+
// Int64 returns the number as an int64.
21+
func (n Number) Int64() (int64, error) {
22+
return strconv.ParseInt(string(n), 10, 64)
23+
}
24+
25+
func CastJsonNumber(val interface{}) (string, bool) {
26+
switch typedVal := val.(type) {
27+
case json.Number:
28+
return string(typedVal), true
29+
case Number:
30+
return string(typedVal), true
31+
}
32+
return "", false
33+
}
34+
35+
var jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem()
36+
var jsoniterNumberType = reflect.TypeOf((*Number)(nil)).Elem()
37+
38+
func createDecoderOfJsonNumber(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
39+
if typ.AssignableTo(jsonNumberType) {
40+
return &jsonNumberCodec{}
41+
}
42+
if typ.AssignableTo(jsoniterNumberType) {
43+
return &jsoniterNumberCodec{}
44+
}
45+
return nil
46+
}
47+
48+
func createEncoderOfJsonNumber(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
49+
if typ.AssignableTo(jsonNumberType) {
50+
return &jsonNumberCodec{}
51+
}
52+
if typ.AssignableTo(jsoniterNumberType) {
53+
return &jsoniterNumberCodec{}
54+
}
55+
return nil
56+
}
57+
58+
type jsonNumberCodec struct {
59+
}
60+
61+
func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
62+
switch iter.WhatIsNext() {
63+
case StringValue:
64+
*((*json.Number)(ptr)) = json.Number(iter.ReadString())
65+
case NilValue:
66+
iter.skipFourBytes('n', 'u', 'l', 'l')
67+
*((*json.Number)(ptr)) = ""
68+
default:
69+
*((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString()))
70+
}
71+
}
72+
73+
func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
74+
number := *((*json.Number)(ptr))
75+
if len(number) == 0 {
76+
stream.writeByte('0')
77+
} else {
78+
stream.WriteRaw(string(number))
79+
}
80+
}
81+
82+
func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
83+
return len(*((*json.Number)(ptr))) == 0
84+
}
85+
86+
type jsoniterNumberCodec struct {
87+
}
88+
89+
func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
90+
switch iter.WhatIsNext() {
91+
case StringValue:
92+
*((*Number)(ptr)) = Number(iter.ReadString())
93+
case NilValue:
94+
iter.skipFourBytes('n', 'u', 'l', 'l')
95+
*((*Number)(ptr)) = ""
96+
default:
97+
*((*Number)(ptr)) = Number([]byte(iter.readNumberAsString()))
98+
}
99+
}
100+
101+
func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
102+
number := *((*Number)(ptr))
103+
if len(number) == 0 {
104+
stream.writeByte('0')
105+
} else {
106+
stream.WriteRaw(string(number))
107+
}
108+
}
109+
110+
func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
111+
return len(*((*Number)(ptr))) == 0
112+
}

reflect_native.go

Lines changed: 0 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -369,62 +369,6 @@ func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool {
369369
return encoder.valType.UnsafeIndirect(ptr) == nil
370370
}
371371

372-
type jsonNumberCodec struct {
373-
}
374-
375-
func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
376-
switch iter.WhatIsNext() {
377-
case StringValue:
378-
*((*json.Number)(ptr)) = json.Number(iter.ReadString())
379-
case NilValue:
380-
iter.skipFourBytes('n', 'u', 'l', 'l')
381-
*((*json.Number)(ptr)) = ""
382-
default:
383-
*((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString()))
384-
}
385-
}
386-
387-
func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
388-
number := *((*json.Number)(ptr))
389-
if len(number) == 0 {
390-
stream.writeByte('0')
391-
} else {
392-
stream.WriteRaw(string(number))
393-
}
394-
}
395-
396-
func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
397-
return len(*((*json.Number)(ptr))) == 0
398-
}
399-
400-
type jsoniterNumberCodec struct {
401-
}
402-
403-
func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
404-
switch iter.WhatIsNext() {
405-
case StringValue:
406-
*((*Number)(ptr)) = Number(iter.ReadString())
407-
case NilValue:
408-
iter.skipFourBytes('n', 'u', 'l', 'l')
409-
*((*Number)(ptr)) = ""
410-
default:
411-
*((*Number)(ptr)) = Number([]byte(iter.readNumberAsString()))
412-
}
413-
}
414-
415-
func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
416-
number := *((*Number)(ptr))
417-
if len(number) == 0 {
418-
stream.writeByte('0')
419-
} else {
420-
stream.WriteRaw(string(number))
421-
}
422-
}
423-
424-
func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
425-
return len(*((*Number)(ptr))) == 0
426-
}
427-
428372
type jsonRawMessageCodec struct {
429373
}
430374

0 commit comments

Comments
 (0)