1package jsoniter 2 3import ( 4 "encoding/json" 5 "github.com/modern-go/reflect2" 6 "unsafe" 7) 8 9var jsonRawMessageType = reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem() 10var jsoniterRawMessageType = reflect2.TypeOfPtr((*RawMessage)(nil)).Elem() 11 12func createEncoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValEncoder { 13 if typ == jsonRawMessageType { 14 return &jsonRawMessageCodec{} 15 } 16 if typ == jsoniterRawMessageType { 17 return &jsoniterRawMessageCodec{} 18 } 19 return nil 20} 21 22func createDecoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValDecoder { 23 if typ == jsonRawMessageType { 24 return &jsonRawMessageCodec{} 25 } 26 if typ == jsoniterRawMessageType { 27 return &jsoniterRawMessageCodec{} 28 } 29 return nil 30} 31 32type jsonRawMessageCodec struct { 33} 34 35func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { 36 *((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes()) 37} 38 39func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { 40 stream.WriteRaw(string(*((*json.RawMessage)(ptr)))) 41} 42 43func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { 44 return len(*((*json.RawMessage)(ptr))) == 0 45} 46 47type jsoniterRawMessageCodec struct { 48} 49 50func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { 51 *((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes()) 52} 53 54func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { 55 stream.WriteRaw(string(*((*RawMessage)(ptr)))) 56} 57 58func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { 59 return len(*((*RawMessage)(ptr))) == 0 60} 61