gojay

high performance JSON encoder/decoder with stream API for Golang
git clone git://git.lair.cx/gojay
Log | Files | Refs | README | LICENSE

commit df5e7d62d422f09ce7b74b3437ab70e5b6597eaa
parent f5587822347e46494d4d53e918709c4db4ec2de2
Author: francoispqt <francois@parquet.ninja>
Date:   Thu,  6 Sep 2018 09:02:39 +0800

add fix on decode interface for bool and nulls

Diffstat:
M.travis.yml | 1+
Mdecode_array.go | 2--
Mdecode_bool.go | 14++++----------
Mdecode_embedded_json.go | 3---
Mdecode_interface.go | 11+++++++++--
Mdecode_interface_test.go | 2++
Mdecode_number_float.go | 4----
Mdecode_number_int.go | 10----------
Mdecode_number_uint.go | 8--------
Mdecode_object.go | 5-----
Mdecode_string.go | 2--
11 files changed, 16 insertions(+), 46 deletions(-)

diff --git a/.travis.yml b/.travis.yml @@ -2,6 +2,7 @@ language: go go: - "1.10.x" + - "1.11.x" - master script: diff --git a/decode_array.go b/decode_array.go @@ -42,7 +42,6 @@ func (dec *Decoder) decodeArray(arr UnmarshalerJSONArray) (int, error) { if err != nil { return 0, err } - dec.cursor++ return dec.cursor, nil case '{', '"', 'f', 't', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': // can't unmarshall to struct @@ -105,7 +104,6 @@ func (dec *Decoder) decodeArrayNull(v interface{}) (int, error) { if err != nil { return 0, err } - dec.cursor++ return dec.cursor, nil case '{', '"', 'f', 't', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': // can't unmarshall to struct diff --git a/decode_bool.go b/decode_bool.go @@ -21,7 +21,6 @@ func (dec *Decoder) decodeBool(v *bool) error { return err } *v = true - dec.cursor++ return nil case 'f': dec.cursor++ @@ -30,7 +29,6 @@ func (dec *Decoder) decodeBool(v *bool) error { return err } *v = false - dec.cursor++ return nil case 'n': dec.cursor++ @@ -39,7 +37,6 @@ func (dec *Decoder) decodeBool(v *bool) error { return err } *v = false - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -67,7 +64,6 @@ func (dec *Decoder) decodeBoolNull(v **bool) error { *v = new(bool) } **v = true - dec.cursor++ return nil case 'f': dec.cursor++ @@ -79,7 +75,6 @@ func (dec *Decoder) decodeBoolNull(v **bool) error { *v = new(bool) } **v = false - dec.cursor++ return nil case 'n': dec.cursor++ @@ -87,7 +82,6 @@ func (dec *Decoder) decodeBoolNull(v **bool) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -119,8 +113,8 @@ func (dec *Decoder) assertTrue() error { } case 3: switch dec.data[dec.cursor] { - case ' ', '\t', '\n', ',', ']', '}': - dec.cursor-- + case ' ', '\b', '\t', '\n', ',', ']', '}': + // dec.cursor-- return nil default: return dec.raiseInvalidJSONErr(dec.cursor) @@ -153,7 +147,7 @@ func (dec *Decoder) assertNull() error { case 3: switch dec.data[dec.cursor] { case ' ', '\t', '\n', ',', ']', '}': - dec.cursor-- + // dec.cursor-- return nil default: return dec.raiseInvalidJSONErr(dec.cursor) @@ -190,7 +184,7 @@ func (dec *Decoder) assertFalse() error { case 4: switch dec.data[dec.cursor] { case ' ', '\t', '\n', ',', ']', '}': - dec.cursor-- + // dec.cursor-- return nil default: return dec.raiseInvalidJSONErr(dec.cursor) diff --git a/decode_embedded_json.go b/decode_embedded_json.go @@ -22,7 +22,6 @@ func (dec *Decoder) decodeEmbeddedJSON(ej *EmbeddedJSON) error { if err != nil { return err } - dec.cursor++ case 't': beginOfEmbeddedJSON = dec.cursor dec.cursor++ @@ -30,7 +29,6 @@ func (dec *Decoder) decodeEmbeddedJSON(ej *EmbeddedJSON) error { if err != nil { return err } - dec.cursor++ // is false case 'f': beginOfEmbeddedJSON = dec.cursor @@ -39,7 +37,6 @@ func (dec *Decoder) decodeEmbeddedJSON(ej *EmbeddedJSON) error { if err != nil { return err } - dec.cursor++ // is an object case '{': beginOfEmbeddedJSON = dec.cursor diff --git a/decode_interface.go b/decode_interface.go @@ -4,6 +4,7 @@ package gojay // the future it would be great to implement one here inside this repo import ( "encoding/json" + "log" ) // DecodeInterface reads the next JSON-encoded value from its input and stores it in the value pointed to by i. @@ -30,6 +31,7 @@ func (dec *Decoder) decodeInterface(i *interface{}) error { } object := dec.data[start:end] + log.Print(string(object)) if err = json.Unmarshal(object, i); err != nil { return err } @@ -41,7 +43,7 @@ func (dec *Decoder) decodeInterface(i *interface{}) error { // @afiune Maybe return the type as well? func (dec *Decoder) getObject() (start int, end int, err error) { // start cursor - start = dec.cursor + log.Print(string(dec.data[dec.cursor:])) for ; dec.cursor < dec.length || dec.read(); dec.cursor++ { switch dec.data[dec.cursor] { case ' ', '\n', '\t', '\r', ',': @@ -57,9 +59,9 @@ func (dec *Decoder) getObject() (start int, end int, err error) { // is a null and should not be unmarshal start = dec.cursor end = dec.cursor - dec.cursor++ return case 't': + start = dec.cursor dec.cursor++ err = dec.assertTrue() if err != nil { @@ -70,6 +72,7 @@ func (dec *Decoder) getObject() (start int, end int, err error) { return // is false case 'f': + start = dec.cursor dec.cursor++ err = dec.assertFalse() if err != nil { @@ -80,12 +83,14 @@ func (dec *Decoder) getObject() (start int, end int, err error) { return // is an object case '{': + start = dec.cursor dec.cursor++ end, err = dec.skipObject() dec.cursor = end return // is string case '"': + start = dec.cursor dec.cursor++ start, end, err = dec.getString() start-- @@ -93,11 +98,13 @@ func (dec *Decoder) getObject() (start int, end int, err error) { return // is array case '[': + start = dec.cursor dec.cursor++ end, err = dec.skipArray() dec.cursor = end return case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-': + start = dec.cursor end, err = dec.skipNumber() dec.cursor = end return diff --git a/decode_interface_test.go b/decode_interface_test.go @@ -2,6 +2,7 @@ package gojay import ( "encoding/json" + "log" "strings" "testing" @@ -127,6 +128,7 @@ func TestDecodeInterfaceBasic(t *testing.T) { for _, testCase := range testCases { t.Run("DecodeInterface()"+testCase.name, func(t *testing.T) { + log.Print(testCase.name) var i interface{} dec := BorrowDecoder(strings.NewReader(testCase.json)) defer dec.Release() diff --git a/decode_number_float.go b/decode_number_float.go @@ -35,7 +35,6 @@ func (dec *Decoder) decodeFloat64(v *float64) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -80,7 +79,6 @@ func (dec *Decoder) decodeFloat64Null(v **float64) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -230,7 +228,6 @@ func (dec *Decoder) decodeFloat32(v *float32) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -275,7 +272,6 @@ func (dec *Decoder) decodeFloat32Null(v **float32) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) diff --git a/decode_number_int.go b/decode_number_int.go @@ -41,7 +41,6 @@ func (dec *Decoder) decodeInt(v *int) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = InvalidUnmarshalError( @@ -94,7 +93,6 @@ func (dec *Decoder) decodeIntNull(v **int) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = InvalidUnmarshalError( @@ -150,7 +148,6 @@ func (dec *Decoder) decodeInt16(v *int16) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -196,7 +193,6 @@ func (dec *Decoder) decodeInt16Null(v **int16) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -384,7 +380,6 @@ func (dec *Decoder) decodeInt8(v *int8) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -430,7 +425,6 @@ func (dec *Decoder) decodeInt8Null(v **int8) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -616,7 +610,6 @@ func (dec *Decoder) decodeInt32(v *int32) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -661,7 +654,6 @@ func (dec *Decoder) decodeInt32Null(v **int32) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -849,7 +841,6 @@ func (dec *Decoder) decodeInt64(v *int64) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -894,7 +885,6 @@ func (dec *Decoder) decodeInt64Null(v **int64) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) diff --git a/decode_number_uint.go b/decode_number_uint.go @@ -39,7 +39,6 @@ func (dec *Decoder) decodeUint8(v *uint8) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -83,7 +82,6 @@ func (dec *Decoder) decodeUint8Null(v **uint8) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -153,7 +151,6 @@ func (dec *Decoder) decodeUint16(v *uint16) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -197,7 +194,6 @@ func (dec *Decoder) decodeUint16Null(v **uint16) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -267,7 +263,6 @@ func (dec *Decoder) decodeUint32(v *uint32) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -311,7 +306,6 @@ func (dec *Decoder) decodeUint32Null(v **uint32) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -380,7 +374,6 @@ func (dec *Decoder) decodeUint64(v *uint64) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -424,7 +417,6 @@ func (dec *Decoder) decodeUint64Null(v **uint64) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) diff --git a/decode_object.go b/decode_object.go @@ -86,7 +86,6 @@ func (dec *Decoder) decodeObject(j UnmarshalerJSONObject) (int, error) { if err != nil { return 0, err } - dec.cursor++ return dec.cursor, nil default: // can't unmarshal to struct @@ -186,7 +185,6 @@ func (dec *Decoder) decodeObjectNull(v interface{}) (int, error) { if err != nil { return 0, err } - dec.cursor++ return dec.cursor, nil default: // can't unmarshal to struct @@ -300,7 +298,6 @@ func (dec *Decoder) skipData() error { if err != nil { return err } - dec.cursor++ return nil case 't': dec.cursor++ @@ -308,7 +305,6 @@ func (dec *Decoder) skipData() error { if err != nil { return err } - dec.cursor++ return nil // is false case 'f': @@ -317,7 +313,6 @@ func (dec *Decoder) skipData() error { if err != nil { return err } - dec.cursor++ return nil // is an object case '{': diff --git a/decode_string.go b/decode_string.go @@ -37,7 +37,6 @@ func (dec *Decoder) decodeString(v *string) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v) @@ -78,7 +77,6 @@ func (dec *Decoder) decodeStringNull(v **string) error { if err != nil { return err } - dec.cursor++ return nil default: dec.err = dec.makeInvalidUnmarshalErr(v)