Skip to content

Commit 2abbab7

Browse files
philhofermreiferson
authored andcommitted
add NewFromReader()
1 parent fe2906c commit 2abbab7

File tree

4 files changed

+108
-4
lines changed

4 files changed

+108
-4
lines changed

simplejson_go10.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package simplejson
55
import (
66
"encoding/json"
77
"errors"
8+
"io"
89
)
910

1011
// Implements the json.Unmarshaler interface.
@@ -20,6 +21,14 @@ func (j *Json) Float64() (float64, error) {
2021
return -1, errors.New("type assertion to float64 failed")
2122
}
2223

24+
// NewFromReader returns a *Json by decoding from an io.Reader
25+
func NewFromReader(r io.Reader) (*Json, error) {
26+
j := new(Json)
27+
dec := json.NewDecoder(r)
28+
err := dec.Decode(&j.data)
29+
return j, err
30+
}
31+
2332
// Int type asserts to `float64` then converts to `int`
2433
func (j *Json) Int() (int, error) {
2534
if f, ok := (j.data).(float64); ok {

simplejson_go10_test.go

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,54 @@
33
package simplejson
44

55
import (
6+
"bytes"
67
"github.com/bmizerany/assert"
78
"strconv"
89
"testing"
910
)
1011

12+
func TestNewFromReader(t *testing.T) {
13+
buf := bytes.NewBuffer([]byte(`{
14+
"test": {
15+
"array": [1, "2", 3],
16+
"arraywithsubs": [
17+
{"subkeyone": 1},
18+
{"subkeytwo": 2, "subkeythree": 3}
19+
],
20+
"bignum": 8000000000
21+
}
22+
}`))
23+
js, err := NewFromReader(buf)
24+
25+
//Standard Test Case
26+
assert.NotEqual(t, nil, js)
27+
assert.Equal(t, nil, err)
28+
29+
arr, _ := js.Get("test").Get("array").Array()
30+
assert.NotEqual(t, nil, arr)
31+
for i, v := range arr {
32+
var iv int
33+
switch v.(type) {
34+
case float64:
35+
iv = int(v.(float64))
36+
case string:
37+
iv, _ = strconv.Atoi(v.(string))
38+
}
39+
assert.Equal(t, i+1, iv)
40+
}
41+
42+
ma := js.Get("test").Get("array").MustArray()
43+
assert.Equal(t, ma, []interface{}{float64(1), "2", float64(3)})
44+
45+
mm := js.Get("test").Get("arraywithsubs").GetIndex(0).MustMap()
46+
assert.Equal(t, mm, map[string]interface{}{"subkeyone": float64(1)})
47+
48+
assert.Equal(t, js.Get("test").Get("bignum").MustInt64(), int64(8000000000))
49+
}
50+
1151
func TestSimplejsonGo10(t *testing.T) {
12-
js, err := NewJson([]byte(`{
13-
"test": {
52+
js, err := NewJson([]byte(`{
53+
"test": {
1454
"array": [1, "2", 3],
1555
"arraywithsubs": [
1656
{"subkeyone": 1},

simplejson_go11.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"bytes"
77
"encoding/json"
88
"errors"
9+
"io"
910
"strconv"
1011
)
1112

@@ -16,6 +17,15 @@ func (j *Json) UnmarshalJSON(p []byte) error {
1617
return dec.Decode(&j.data)
1718
}
1819

20+
// NewFromReader returns a *Json by decoding from an io.Reader
21+
func NewFromReader(r io.Reader) (*Json, error) {
22+
j := new(Json)
23+
dec := json.NewDecoder(r)
24+
dec.UseNumber()
25+
err := dec.Decode(&j.data)
26+
return j, err
27+
}
28+
1929
// Float64 type asserts to `json.Number` then converts to `float64`
2030
func (j *Json) Float64() (float64, error) {
2131
if n, ok := (j.data).(json.Number); ok {

simplejson_go11_test.go

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,60 @@
33
package simplejson
44

55
import (
6+
"bytes"
67
"encoding/json"
78
"github.com/bmizerany/assert"
89
"strconv"
910
"testing"
1011
)
1112

13+
func TestNewFromReader(t *testing.T) {
14+
//Use New Constructor
15+
buf := bytes.NewBuffer([]byte(`{
16+
"test": {
17+
"array": [1, "2", 3],
18+
"arraywithsubs": [
19+
{"subkeyone": 1},
20+
{"subkeytwo": 2, "subkeythree": 3}
21+
],
22+
"bignum": 9223372036854775807,
23+
"uint64": 18446744073709551615
24+
}
25+
}`))
26+
js, err := NewFromReader(buf)
27+
28+
//Standard Test Case
29+
assert.NotEqual(t, nil, js)
30+
assert.Equal(t, nil, err)
31+
32+
arr, _ := js.Get("test").Get("array").Array()
33+
assert.NotEqual(t, nil, arr)
34+
for i, v := range arr {
35+
var iv int
36+
switch v.(type) {
37+
case json.Number:
38+
i64, err := v.(json.Number).Int64()
39+
assert.Equal(t, nil, err)
40+
iv = int(i64)
41+
case string:
42+
iv, _ = strconv.Atoi(v.(string))
43+
}
44+
assert.Equal(t, i+1, iv)
45+
}
46+
47+
ma := js.Get("test").Get("array").MustArray()
48+
assert.Equal(t, ma, []interface{}{json.Number("1"), "2", json.Number("3")})
49+
50+
mm := js.Get("test").Get("arraywithsubs").GetIndex(0).MustMap()
51+
assert.Equal(t, mm, map[string]interface{}{"subkeyone": json.Number("1")})
52+
53+
assert.Equal(t, js.Get("test").Get("bignum").MustInt64(), int64(9223372036854775807))
54+
assert.Equal(t, js.Get("test").Get("uint64").MustUint64(), uint64(18446744073709551615))
55+
}
56+
1257
func TestSimplejsonGo11(t *testing.T) {
13-
js, err := NewJson([]byte(`{
14-
"test": {
58+
js, err := NewJson([]byte(`{
59+
"test": {
1560
"array": [1, "2", 3],
1661
"arraywithsubs": [
1762
{"subkeyone": 1},

0 commit comments

Comments
 (0)