package gojay
import (
"fmt"
"io"
)
func UnmarshalJSONArray (data []byte , v UnmarshalerJSONArray ) error {
dec := borrowDecoder (nil , 0 )
defer dec .Release ()
dec .data = make ([]byte , len (data ))
copy (dec .data , data )
dec .length = len (data )
_ , err := dec .decodeArray (v )
if err != nil {
return err
}
if dec .err != nil {
return dec .err
}
return nil
}
func UnmarshalJSONObject (data []byte , v UnmarshalerJSONObject ) error {
dec := borrowDecoder (nil , 0 )
defer dec .Release ()
dec .data = make ([]byte , len (data ))
copy (dec .data , data )
dec .length = len (data )
_ , err := dec .decodeObject (v )
if err != nil {
return err
}
if dec .err != nil {
return dec .err
}
return nil
}
func Unmarshal (data []byte , v interface {}) error {
var err error
var dec *Decoder
switch vt := v .(type ) {
case *string :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeString (vt )
case **string :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeStringNull (vt )
case *int :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeInt (vt )
case **int :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeIntNull (vt )
case *int8 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeInt8 (vt )
case **int8 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeInt8Null (vt )
case *int16 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeInt16 (vt )
case **int16 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeInt16Null (vt )
case *int32 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeInt32 (vt )
case **int32 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeInt32Null (vt )
case *int64 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeInt64 (vt )
case **int64 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeInt64Null (vt )
case *uint8 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeUint8 (vt )
case **uint8 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeUint8Null (vt )
case *uint16 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeUint16 (vt )
case **uint16 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeUint16Null (vt )
case *uint32 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeUint32 (vt )
case **uint32 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeUint32Null (vt )
case *uint64 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeUint64 (vt )
case **uint64 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeUint64Null (vt )
case *float64 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeFloat64 (vt )
case **float64 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeFloat64Null (vt )
case *float32 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeFloat32 (vt )
case **float32 :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeFloat32Null (vt )
case *bool :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeBool (vt )
case **bool :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = data
err = dec .decodeBoolNull (vt )
case UnmarshalerJSONObject :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = make ([]byte , len (data ))
copy (dec .data , data )
_, err = dec .decodeObject (vt )
case UnmarshalerJSONArray :
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = make ([]byte , len (data ))
copy (dec .data , data )
_, err = dec .decodeArray (vt )
case *interface {}:
dec = borrowDecoder (nil , 0 )
dec .length = len (data )
dec .data = make ([]byte , len (data ))
copy (dec .data , data )
err = dec .decodeInterface (vt )
default :
return InvalidUnmarshalError (fmt .Sprintf (invalidUnmarshalErrorMsg , vt ))
}
defer dec .Release ()
if err != nil {
return err
}
return dec .err
}
type UnmarshalerJSONObject interface {
UnmarshalJSONObject (*Decoder , string ) error
NKeys () int
}
type UnmarshalerJSONArray interface {
UnmarshalJSONArray (*Decoder ) error
}
type Decoder struct {
r io .Reader
data []byte
err error
isPooled byte
called byte
child byte
cursor int
length int
keysDone int
arrayIndex int
}
func (dec *Decoder ) Decode (v interface {}) error {
if dec .isPooled == 1 {
panic (InvalidUsagePooledDecoderError ("Invalid usage of pooled decoder" ))
}
var err error
switch vt := v .(type ) {
case *string :
err = dec .decodeString (vt )
case **string :
err = dec .decodeStringNull (vt )
case *int :
err = dec .decodeInt (vt )
case **int :
err = dec .decodeIntNull (vt )
case *int8 :
err = dec .decodeInt8 (vt )
case **int8 :
err = dec .decodeInt8Null (vt )
case *int16 :
err = dec .decodeInt16 (vt )
case **int16 :
err = dec .decodeInt16Null (vt )
case *int32 :
err = dec .decodeInt32 (vt )
case **int32 :
err = dec .decodeInt32Null (vt )
case *int64 :
err = dec .decodeInt64 (vt )
case **int64 :
err = dec .decodeInt64Null (vt )
case *uint8 :
err = dec .decodeUint8 (vt )
case **uint8 :
err = dec .decodeUint8Null (vt )
case *uint16 :
err = dec .decodeUint16 (vt )
case **uint16 :
err = dec .decodeUint16Null (vt )
case *uint32 :
err = dec .decodeUint32 (vt )
case **uint32 :
err = dec .decodeUint32Null (vt )
case *uint64 :
err = dec .decodeUint64 (vt )
case **uint64 :
err = dec .decodeUint64Null (vt )
case *float64 :
err = dec .decodeFloat64 (vt )
case **float64 :
err = dec .decodeFloat64Null (vt )
case *float32 :
err = dec .decodeFloat32 (vt )
case **float32 :
err = dec .decodeFloat32Null (vt )
case *bool :
err = dec .decodeBool (vt )
case **bool :
err = dec .decodeBoolNull (vt )
case UnmarshalerJSONObject :
_, err = dec .decodeObject (vt )
case UnmarshalerJSONArray :
_, err = dec .decodeArray (vt )
case *EmbeddedJSON :
err = dec .decodeEmbeddedJSON (vt )
case *interface {}:
err = dec .decodeInterface (vt )
default :
return InvalidUnmarshalError (fmt .Sprintf (invalidUnmarshalErrorMsg , vt ))
}
if err != nil {
return err
}
return dec .err
}
func isDigit(b byte ) bool {
switch b {
case '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' :
return true
default :
return false
}
}
func (dec *Decoder ) read () bool {
if dec .r != nil {
if len (dec .data ) == dec .length {
nLen := dec .length * 2
if nLen == 0 {
nLen = 512
}
Buf := make ([]byte , nLen , nLen )
copy (Buf , dec .data )
dec .data = Buf
}
var n int
var err error
for n == 0 {
n , err = dec .r .Read (dec .data [dec .length :])
if err != nil {
if err != io .EOF {
dec .err = err
return false
}
if n == 0 {
return false
}
dec .length = dec .length + n
return true
}
}
dec .length = dec .length + n
return true
}
return false
}
func (dec *Decoder ) nextChar () byte {
for ; dec .cursor < dec .length || dec .read (); dec .cursor ++ {
switch dec .data [dec .cursor ] {
case ' ' , '\n' , '\t' , '\r' , ',' :
continue
}
d := dec .data [dec .cursor ]
return d
}
return 0
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .