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:
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)
+ }
+}