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

Commit 895a19f

Browse files
committed
move json raw message
1 parent 6327145 commit 895a19f

File tree

5 files changed

+155
-132
lines changed

5 files changed

+155
-132
lines changed

reflect.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,11 @@ func decoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecode
106106

107107
func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
108108
typeName := typ.String()
109-
if typ == jsonRawMessageType {
110-
return &jsonRawMessageCodec{}
111-
}
112-
if typ == jsoniterRawMessageType {
113-
return &jsoniterRawMessageCodec{}
109+
decoder := createDecoderOfJsonRawMessage(cfg, prefix, typ)
110+
if decoder != nil {
111+
return decoder
114112
}
115-
decoder := createDecoderOfJsonNumber(cfg, prefix, typ)
113+
decoder = createDecoderOfJsonNumber(cfg, prefix, typ)
116114
if decoder != nil {
117115
return decoder
118116
}
@@ -295,13 +293,11 @@ func encoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncode
295293
}
296294

297295
func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
298-
if typ == jsonRawMessageType {
299-
return &jsonRawMessageCodec{}
300-
}
301-
if typ == jsoniterRawMessageType {
302-
return &jsoniterRawMessageCodec{}
296+
encoder := createEncoderOfJsonRawMessage(cfg, prefix, typ)
297+
if encoder != nil {
298+
return encoder
303299
}
304-
encoder := createEncoderOfJsonNumber(cfg, prefix, typ)
300+
encoder = createEncoderOfJsonNumber(cfg, prefix, typ)
305301
if encoder != nil {
306302
return encoder
307303
}

reflect_json_raw_message.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package jsoniter
2+
3+
import (
4+
"unsafe"
5+
"encoding/json"
6+
"reflect"
7+
)
8+
9+
func createEncoderOfJsonRawMessage(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
10+
if typ == jsonRawMessageType {
11+
return &jsonRawMessageCodec{}
12+
}
13+
if typ == jsoniterRawMessageType {
14+
return &jsoniterRawMessageCodec{}
15+
}
16+
return nil
17+
}
18+
19+
func createDecoderOfJsonRawMessage(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
20+
if typ == jsonRawMessageType {
21+
return &jsonRawMessageCodec{}
22+
}
23+
if typ == jsoniterRawMessageType {
24+
return &jsoniterRawMessageCodec{}
25+
}
26+
return nil
27+
}
28+
29+
type jsonRawMessageCodec struct {
30+
}
31+
32+
func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
33+
*((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes())
34+
}
35+
36+
func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
37+
stream.WriteRaw(string(*((*json.RawMessage)(ptr))))
38+
}
39+
40+
func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
41+
return len(*((*json.RawMessage)(ptr))) == 0
42+
}
43+
44+
type jsoniterRawMessageCodec struct {
45+
}
46+
47+
func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
48+
*((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes())
49+
}
50+
51+
func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
52+
stream.WriteRaw(string(*((*RawMessage)(ptr))))
53+
}
54+
55+
func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
56+
return len(*((*RawMessage)(ptr))) == 0
57+
}

reflect_native.go

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

372-
type jsonRawMessageCodec struct {
373-
}
374-
375-
func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
376-
*((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes())
377-
}
378-
379-
func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
380-
stream.WriteRaw(string(*((*json.RawMessage)(ptr))))
381-
}
382-
383-
func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
384-
return len(*((*json.RawMessage)(ptr))) == 0
385-
}
386-
387-
type jsoniterRawMessageCodec struct {
388-
}
389-
390-
func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
391-
*((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes())
392-
}
393-
394-
func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
395-
stream.WriteRaw(string(*((*RawMessage)(ptr))))
396-
}
397-
398-
func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
399-
return len(*((*RawMessage)(ptr))) == 0
400-
}
401-
402372
type base64Codec struct {
403373
sliceType *reflect2.UnsafeSliceType
404374
sliceDecoder ValDecoder
@@ -448,67 +418,3 @@ func (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) {
448418
func (codec *base64Codec) IsEmpty(ptr unsafe.Pointer) bool {
449419
return len(*((*[]byte)(ptr))) == 0
450420
}
451-
452-
type stringModeNumberDecoder struct {
453-
elemDecoder ValDecoder
454-
}
455-
456-
func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
457-
c := iter.nextToken()
458-
if c != '"' {
459-
iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
460-
return
461-
}
462-
decoder.elemDecoder.Decode(ptr, iter)
463-
if iter.Error != nil {
464-
return
465-
}
466-
c = iter.readByte()
467-
if c != '"' {
468-
iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
469-
return
470-
}
471-
}
472-
473-
type stringModeStringDecoder struct {
474-
elemDecoder ValDecoder
475-
cfg *frozenConfig
476-
}
477-
478-
func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
479-
decoder.elemDecoder.Decode(ptr, iter)
480-
str := *((*string)(ptr))
481-
tempIter := decoder.cfg.BorrowIterator([]byte(str))
482-
defer decoder.cfg.ReturnIterator(tempIter)
483-
*((*string)(ptr)) = tempIter.ReadString()
484-
}
485-
486-
type stringModeNumberEncoder struct {
487-
elemEncoder ValEncoder
488-
}
489-
490-
func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
491-
stream.writeByte('"')
492-
encoder.elemEncoder.Encode(ptr, stream)
493-
stream.writeByte('"')
494-
}
495-
496-
func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool {
497-
return encoder.elemEncoder.IsEmpty(ptr)
498-
}
499-
500-
type stringModeStringEncoder struct {
501-
elemEncoder ValEncoder
502-
cfg *frozenConfig
503-
}
504-
505-
func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
506-
tempStream := encoder.cfg.BorrowStream(nil)
507-
defer encoder.cfg.ReturnStream(tempStream)
508-
encoder.elemEncoder.Encode(ptr, tempStream)
509-
stream.WriteString(string(tempStream.Buffer()))
510-
}
511-
512-
func (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool {
513-
return encoder.elemEncoder.IsEmpty(ptr)
514-
}

reflect_struct_decoder.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,32 @@ import (
88
"unsafe"
99
)
1010

11+
func decoderOfStruct(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
12+
bindings := map[string]*Binding{}
13+
structDescriptor := describeStruct(cfg, prefix, typ)
14+
for _, binding := range structDescriptor.Fields {
15+
for _, fromName := range binding.FromNames {
16+
old := bindings[fromName]
17+
if old == nil {
18+
bindings[fromName] = binding
19+
continue
20+
}
21+
ignoreOld, ignoreNew := resolveConflictBinding(cfg, old, binding)
22+
if ignoreOld {
23+
delete(bindings, fromName)
24+
}
25+
if !ignoreNew {
26+
bindings[fromName] = binding
27+
}
28+
}
29+
}
30+
fields := map[string]*structFieldDecoder{}
31+
for k, binding := range bindings {
32+
fields[k] = binding.Decoder.(*structFieldDecoder)
33+
}
34+
return createStructDecoder(cfg, typ, fields)
35+
}
36+
1137
func createStructDecoder(cfg *frozenConfig, typ reflect.Type, fields map[string]*structFieldDecoder) ValDecoder {
1238
if cfg.disallowUnknownFields {
1339
return &generalStructDecoder{typ: typ, fields: fields, disallowUnknownFields: true}
@@ -972,3 +998,37 @@ func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
972998
iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error())
973999
}
9741000
}
1001+
1002+
type stringModeStringDecoder struct {
1003+
elemDecoder ValDecoder
1004+
cfg *frozenConfig
1005+
}
1006+
1007+
func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
1008+
decoder.elemDecoder.Decode(ptr, iter)
1009+
str := *((*string)(ptr))
1010+
tempIter := decoder.cfg.BorrowIterator([]byte(str))
1011+
defer decoder.cfg.ReturnIterator(tempIter)
1012+
*((*string)(ptr)) = tempIter.ReadString()
1013+
}
1014+
1015+
type stringModeNumberDecoder struct {
1016+
elemDecoder ValDecoder
1017+
}
1018+
1019+
func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) {
1020+
c := iter.nextToken()
1021+
if c != '"' {
1022+
iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
1023+
return
1024+
}
1025+
decoder.elemDecoder.Decode(ptr, iter)
1026+
if iter.Error != nil {
1027+
return
1028+
}
1029+
c = iter.readByte()
1030+
if c != '"' {
1031+
iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c}))
1032+
return
1033+
}
1034+
}

reflect_struct_encoder.go

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -74,32 +74,6 @@ func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ig
7474
}
7575
}
7676

77-
func decoderOfStruct(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
78-
bindings := map[string]*Binding{}
79-
structDescriptor := describeStruct(cfg, prefix, typ)
80-
for _, binding := range structDescriptor.Fields {
81-
for _, fromName := range binding.FromNames {
82-
old := bindings[fromName]
83-
if old == nil {
84-
bindings[fromName] = binding
85-
continue
86-
}
87-
ignoreOld, ignoreNew := resolveConflictBinding(cfg, old, binding)
88-
if ignoreOld {
89-
delete(bindings, fromName)
90-
}
91-
if !ignoreNew {
92-
bindings[fromName] = binding
93-
}
94-
}
95-
}
96-
fields := map[string]*structFieldDecoder{}
97-
for k, binding := range bindings {
98-
fields[k] = binding.Decoder.(*structFieldDecoder)
99-
}
100-
return createStructDecoder(cfg, typ, fields)
101-
}
102-
10377
type structFieldEncoder struct {
10478
field *reflect.StructField
10579
fieldEncoder ValEncoder
@@ -179,3 +153,33 @@ func (encoder *emptyStructEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
179153
func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool {
180154
return false
181155
}
156+
157+
type stringModeNumberEncoder struct {
158+
elemEncoder ValEncoder
159+
}
160+
161+
func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
162+
stream.writeByte('"')
163+
encoder.elemEncoder.Encode(ptr, stream)
164+
stream.writeByte('"')
165+
}
166+
167+
func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool {
168+
return encoder.elemEncoder.IsEmpty(ptr)
169+
}
170+
171+
type stringModeStringEncoder struct {
172+
elemEncoder ValEncoder
173+
cfg *frozenConfig
174+
}
175+
176+
func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) {
177+
tempStream := encoder.cfg.BorrowStream(nil)
178+
defer encoder.cfg.ReturnStream(tempStream)
179+
encoder.elemEncoder.Encode(ptr, tempStream)
180+
stream.WriteString(string(tempStream.Buffer()))
181+
}
182+
183+
func (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool {
184+
return encoder.elemEncoder.IsEmpty(ptr)
185+
}

0 commit comments

Comments
 (0)