reflect_json_raw_message.go 1.4 KB

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