feature_adapter.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package jsoniter
  2. import (
  3. "io"
  4. "bytes"
  5. )
  6. // Unmarshal adapts to json/encoding Unmarshal API
  7. //
  8. // Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v.
  9. func Unmarshal(data []byte, v interface{}) error {
  10. data = data[:lastNotSpacePos(data)]
  11. iter := ParseBytes(data)
  12. iter.ReadVal(v)
  13. if iter.head == iter.tail {
  14. iter.loadMore()
  15. }
  16. if iter.Error == io.EOF {
  17. return nil
  18. }
  19. if iter.Error == nil {
  20. iter.reportError("Unmarshal", "there are bytes left after unmarshal")
  21. }
  22. return iter.Error
  23. }
  24. func UnmarshalAny(data []byte) (Any, error) {
  25. data = data[:lastNotSpacePos(data)]
  26. iter := ParseBytes(data)
  27. any := iter.ReadAny()
  28. if iter.head == iter.tail {
  29. iter.loadMore()
  30. }
  31. if iter.Error == io.EOF {
  32. return any, nil
  33. }
  34. if iter.Error == nil {
  35. iter.reportError("UnmarshalAny", "there are bytes left after unmarshal")
  36. }
  37. return any, iter.Error
  38. }
  39. func lastNotSpacePos(data []byte) int {
  40. for i := len(data) - 1; i >= 0; i-- {
  41. if data[i] != ' ' && data[i] != '\t' && data[i] != '\r' && data[i] != '\n' {
  42. return i + 1
  43. }
  44. }
  45. return 0
  46. }
  47. func UnmarshalFromString(str string, v interface{}) error {
  48. data := []byte(str)
  49. data = data[:lastNotSpacePos(data)]
  50. iter := ParseBytes(data)
  51. iter.ReadVal(v)
  52. if iter.head == iter.tail {
  53. iter.loadMore()
  54. }
  55. if iter.Error == io.EOF {
  56. return nil
  57. }
  58. if iter.Error == nil {
  59. iter.reportError("UnmarshalFromString", "there are bytes left after unmarshal")
  60. }
  61. return iter.Error
  62. }
  63. func UnmarshalAnyFromString(str string) (Any, error) {
  64. data := []byte(str)
  65. data = data[:lastNotSpacePos(data)]
  66. iter := ParseBytes(data)
  67. any := iter.ReadAny()
  68. if iter.head == iter.tail {
  69. iter.loadMore()
  70. }
  71. if iter.Error == io.EOF {
  72. return any, nil
  73. }
  74. if iter.Error == nil {
  75. iter.reportError("UnmarshalAnyFromString", "there are bytes left after unmarshal")
  76. }
  77. return nil, iter.Error
  78. }
  79. // Marshal adapts to json/encoding Marshal API
  80. //
  81. // Marshal returns the JSON encoding of v, adapts to json/encoding Marshal API
  82. func Marshal(v interface{}) ([]byte, error) {
  83. buf := &bytes.Buffer{}
  84. stream := NewStream(buf, 512)
  85. stream.WriteVal(v)
  86. stream.Flush()
  87. if stream.Error != nil {
  88. return nil, stream.Error
  89. }
  90. return buf.Bytes(), nil
  91. }
  92. func MarshalToString(v interface{}) (string, error) {
  93. buf, err := Marshal(v)
  94. if err != nil {
  95. return "", err
  96. }
  97. return string(buf), nil
  98. }
  99. // NewDecoder adapts to json/stream NewDecoder API.
  100. //
  101. // NewDecoder returns a new decoder that reads from r.
  102. func NewDecoder(reader io.Reader) *AdaptedDecoder {
  103. iter := Parse(reader, 512)
  104. return &AdaptedDecoder{iter}
  105. }
  106. type AdaptedDecoder struct {
  107. iter *Iterator
  108. }
  109. func (adapter *AdaptedDecoder) Decode(obj interface{}) error {
  110. adapter.iter.ReadVal(obj)
  111. err := adapter.iter.Error
  112. if err == io.EOF {
  113. return nil
  114. }
  115. return adapter.iter.Error
  116. }
  117. func (adapter *AdaptedDecoder) More() bool {
  118. return adapter.iter.head != adapter.iter.tail
  119. }
  120. func (adapter *AdaptedDecoder) Buffered() io.Reader {
  121. remaining := adapter.iter.buf[adapter.iter.head:adapter.iter.tail]
  122. return bytes.NewReader(remaining)
  123. }
  124. func NewEncoder(writer io.Writer) *AdaptedEncoder {
  125. stream := NewStream(writer, 512)
  126. return &AdaptedEncoder{stream}
  127. }
  128. type AdaptedEncoder struct {
  129. stream *Stream
  130. }
  131. func (adapter *AdaptedEncoder) Encode(val interface{}) error {
  132. adapter.stream.WriteVal(val)
  133. adapter.stream.Flush()
  134. return adapter.stream.Error
  135. }
  136. func (adapter *AdaptedEncoder) SetIndent(prefix, indent string) {
  137. // not implemented yet
  138. }