podman

Форк
0
/
reflect_json_raw_message.go 
76 строк · 1.8 Кб
1
package jsoniter
2

3
import (
4
	"encoding/json"
5
	"github.com/modern-go/reflect2"
6
	"unsafe"
7
)
8

9
var jsonRawMessageType = reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()
10
var jsoniterRawMessageType = reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()
11

12
func 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

22
func 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

32
type jsonRawMessageCodec struct {
33
}
34

35
func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
36
	if iter.ReadNil() {
37
		*((*json.RawMessage)(ptr)) = nil
38
	} else {
39
		*((*json.RawMessage)(ptr)) = iter.SkipAndReturnBytes()
40
	}
41
}
42

43
func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
44
	if *((*json.RawMessage)(ptr)) == nil {
45
		stream.WriteNil()
46
	} else {
47
		stream.WriteRaw(string(*((*json.RawMessage)(ptr))))
48
	}
49
}
50

51
func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
52
	return len(*((*json.RawMessage)(ptr))) == 0
53
}
54

55
type jsoniterRawMessageCodec struct {
56
}
57

58
func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
59
	if iter.ReadNil() {
60
		*((*RawMessage)(ptr)) = nil
61
	} else {
62
		*((*RawMessage)(ptr)) = iter.SkipAndReturnBytes()
63
	}
64
}
65

66
func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
67
	if *((*RawMessage)(ptr)) == nil {
68
		stream.WriteNil()
69
	} else {
70
		stream.WriteRaw(string(*((*RawMessage)(ptr))))
71
	}
72
}
73

74
func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
75
	return len(*((*RawMessage)(ptr))) == 0
76
}
77

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.