gojay

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

commit ce7321b4a47c7d5137f8022a463e4c0393814ab4
parent 589f634deb0ce9ec0694c863f938284dccce24db
Author: francoispqt <francois@parquet.ninja>
Date:   Thu,  3 May 2018 23:36:32 +0800

add examples for in http handling and fix potential error on treating io.ReadCloser

Diffstat:
Mdecode.go | 7++++++-
Mdecode_object.go | 2+-
Mdecode_object_test.go | 27+++++++++++++++++++++++++++
Aexamples/http-json/main.go | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 104 insertions(+), 2 deletions(-)

diff --git a/decode.go b/decode.go @@ -298,8 +298,13 @@ func (dec *Decoder) read() bool { if err != nil { if err != io.EOF { dec.err = err + return false } - return false + if n == 0 { + return false + } + dec.length = dec.length + n + return true } } dec.length = dec.length + n diff --git a/decode_object.go b/decode_object.go @@ -98,7 +98,7 @@ func (dec *Decoder) decodeObject(j UnmarshalerObject) (int, error) { return dec.cursor, nil } } - return 0, InvalidJSONError("Invalid JSON while paring object") + return 0, InvalidJSONError("Invalid JSON while parsing object") } func (dec *Decoder) skipObject() (int, error) { diff --git a/decode_object_test.go b/decode_object_test.go @@ -1,6 +1,7 @@ package gojay import ( + "io" "strings" "testing" @@ -354,6 +355,32 @@ func TestDecoderObjectDecoderAPI(t *testing.T) { assertResult(t, v, err) } +type ReadCloser struct { + json []byte +} + +func (r *ReadCloser) Read(b []byte) (int, error) { + copy(b, r.json) + return len(r.json), io.EOF +} + +func TestDecoderObjectDecoderAPIReadCloser(t *testing.T) { + readCloser := ReadCloser{ + json: []byte(`{ + "test": "string", + "test2": "string", + "test3": "string", + "test4": "string", + "test5": "string", + }`), + } + m := myMap(make(map[string]string)) + dec := NewDecoder(&readCloser) + err := dec.DecodeObject(m) + assert.Nil(t, err, "err should be nil") + assert.Len(t, m, 5, "len of m should be 5") +} + func TestDecoderObjectDecoderInvalidJSONError(t *testing.T) { v := &TestObj{} dec := NewDecoder(strings.NewReader(`{"err:}`)) diff --git a/examples/http-json/main.go b/examples/http-json/main.go @@ -0,0 +1,70 @@ +package main + +import ( + "net/http" + + "github.com/francoispqt/gojay" +) + +type message struct { + foo string + bar string +} + +func (m *message) UnmarshalObject(dec *gojay.Decoder, k string) error { + switch k { + case "foo": + return dec.AddString(&m.foo) + case "bar": + return dec.AddString(&m.bar) + } + return nil +} + +func (m *message) NKeys() int { + return 2 +} + +func (m *message) MarshalObject(dec *gojay.Encoder) { + dec.AddStringKey("foo", m.foo) + dec.AddStringKey("bar", m.bar) +} + +func (m *message) IsNil() bool { + return m == nil +} + +func home(w http.ResponseWriter, r *http.Request) { + // read body using io.Reader + m := &message{} + dec := gojay.BorrowDecoder(r.Body) + defer dec.Release() + err := dec.DecodeObject(m) + if err != nil { + i, err := w.Write([]byte(err.Error())) + if err != nil || i == 0 { + panic(err) + } + return + } + + // just transform response slightly + m.foo += "hey" + + // return response using io.Writer + enc := gojay.BorrowEncoder(w) + defer enc.Release() + err = enc.Encode(m) + i, err := w.Write([]byte(err.Error())) + if err != nil || i == 0 { + panic(err) + } + return +} + +func main() { + http.HandleFunc("/", home) + if err := http.ListenAndServe(":8080", nil); err != nil { + panic(err) + } +}