adapter.go raw

   1  package jsoniter
   2  
   3  import (
   4  	"bytes"
   5  	"io"
   6  )
   7  
   8  // RawMessage to make replace json with jsoniter
   9  type RawMessage []byte
  10  
  11  // Unmarshal adapts to json/encoding Unmarshal API
  12  //
  13  // Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v.
  14  // Refer to https://godoc.org/encoding/json#Unmarshal for more information
  15  func Unmarshal(data []byte, v interface{}) error {
  16  	return ConfigDefault.Unmarshal(data, v)
  17  }
  18  
  19  // UnmarshalFromString is a convenient method to read from string instead of []byte
  20  func UnmarshalFromString(str string, v interface{}) error {
  21  	return ConfigDefault.UnmarshalFromString(str, v)
  22  }
  23  
  24  // Get quick method to get value from deeply nested JSON structure
  25  func Get(data []byte, path ...interface{}) Any {
  26  	return ConfigDefault.Get(data, path...)
  27  }
  28  
  29  // Marshal adapts to json/encoding Marshal API
  30  //
  31  // Marshal returns the JSON encoding of v, adapts to json/encoding Marshal API
  32  // Refer to https://godoc.org/encoding/json#Marshal for more information
  33  func Marshal(v interface{}) ([]byte, error) {
  34  	return ConfigDefault.Marshal(v)
  35  }
  36  
  37  // MarshalIndent same as json.MarshalIndent. Prefix is not supported.
  38  func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
  39  	return ConfigDefault.MarshalIndent(v, prefix, indent)
  40  }
  41  
  42  // MarshalToString convenient method to write as string instead of []byte
  43  func MarshalToString(v interface{}) (string, error) {
  44  	return ConfigDefault.MarshalToString(v)
  45  }
  46  
  47  // NewDecoder adapts to json/stream NewDecoder API.
  48  //
  49  // NewDecoder returns a new decoder that reads from r.
  50  //
  51  // Instead of a json/encoding Decoder, an Decoder is returned
  52  // Refer to https://godoc.org/encoding/json#NewDecoder for more information
  53  func NewDecoder(reader io.Reader) *Decoder {
  54  	return ConfigDefault.NewDecoder(reader)
  55  }
  56  
  57  // Decoder reads and decodes JSON values from an input stream.
  58  // Decoder provides identical APIs with json/stream Decoder (Token() and UseNumber() are in progress)
  59  type Decoder struct {
  60  	iter *Iterator
  61  }
  62  
  63  // Decode decode JSON into interface{}
  64  func (adapter *Decoder) Decode(obj interface{}) error {
  65  	if adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil {
  66  		if !adapter.iter.loadMore() {
  67  			return io.EOF
  68  		}
  69  	}
  70  	adapter.iter.ReadVal(obj)
  71  	err := adapter.iter.Error
  72  	if err == io.EOF {
  73  		return nil
  74  	}
  75  	return adapter.iter.Error
  76  }
  77  
  78  // More is there more?
  79  func (adapter *Decoder) More() bool {
  80  	iter := adapter.iter
  81  	if iter.Error != nil {
  82  		return false
  83  	}
  84  	c := iter.nextToken()
  85  	if c == 0 {
  86  		return false
  87  	}
  88  	iter.unreadByte()
  89  	return c != ']' && c != '}'
  90  }
  91  
  92  // Buffered remaining buffer
  93  func (adapter *Decoder) Buffered() io.Reader {
  94  	remaining := adapter.iter.buf[adapter.iter.head:adapter.iter.tail]
  95  	return bytes.NewReader(remaining)
  96  }
  97  
  98  // UseNumber causes the Decoder to unmarshal a number into an interface{} as a
  99  // Number instead of as a float64.
 100  func (adapter *Decoder) UseNumber() {
 101  	cfg := adapter.iter.cfg.configBeforeFrozen
 102  	cfg.UseNumber = true
 103  	adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
 104  }
 105  
 106  // DisallowUnknownFields causes the Decoder to return an error when the destination
 107  // is a struct and the input contains object keys which do not match any
 108  // non-ignored, exported fields in the destination.
 109  func (adapter *Decoder) DisallowUnknownFields() {
 110  	cfg := adapter.iter.cfg.configBeforeFrozen
 111  	cfg.DisallowUnknownFields = true
 112  	adapter.iter.cfg = cfg.frozeWithCacheReuse(adapter.iter.cfg.extraExtensions)
 113  }
 114  
 115  // NewEncoder same as json.NewEncoder
 116  func NewEncoder(writer io.Writer) *Encoder {
 117  	return ConfigDefault.NewEncoder(writer)
 118  }
 119  
 120  // Encoder same as json.Encoder
 121  type Encoder struct {
 122  	stream *Stream
 123  }
 124  
 125  // Encode encode interface{} as JSON to io.Writer
 126  func (adapter *Encoder) Encode(val interface{}) error {
 127  	adapter.stream.WriteVal(val)
 128  	adapter.stream.WriteRaw("\n")
 129  	adapter.stream.Flush()
 130  	return adapter.stream.Error
 131  }
 132  
 133  // SetIndent set the indention. Prefix is not supported
 134  func (adapter *Encoder) SetIndent(prefix, indent string) {
 135  	config := adapter.stream.cfg.configBeforeFrozen
 136  	config.IndentionStep = len(indent)
 137  	adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
 138  }
 139  
 140  // SetEscapeHTML escape html by default, set to false to disable
 141  func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) {
 142  	config := adapter.stream.cfg.configBeforeFrozen
 143  	config.EscapeHTML = escapeHTML
 144  	adapter.stream.cfg = config.frozeWithCacheReuse(adapter.stream.cfg.extraExtensions)
 145  }
 146  
 147  // Valid reports whether data is a valid JSON encoding.
 148  func Valid(data []byte) bool {
 149  	return ConfigDefault.Valid(data)
 150  }
 151