1
0
mirror of https://github.com/json-iterator/go.git synced 2024-11-24 08:22:14 +02:00

read to interface{}

This commit is contained in:
Tao Wen 2017-01-21 16:09:38 +08:00
parent 928bc4ce72
commit 1d29fa38ef
8 changed files with 71 additions and 40 deletions

View File

@ -208,7 +208,7 @@ func (iter *Iterator) ReadAny() (ret *Any) {
return MakeAny(iter.ReadString())
case Number:
return iter.readNumber()
case Null:
case Nil:
return MakeAny(nil)
case Bool:
return MakeAny(iter.ReadBool())

View File

@ -12,7 +12,7 @@ const (
Invalid ValueType = iota
String
Number
Null
Nil
Bool
Array
Object
@ -53,7 +53,7 @@ func init() {
valueTypes['9'] = Number
valueTypes['t'] = Bool
valueTypes['f'] = Bool
valueTypes['n'] = Null
valueTypes['n'] = Nil
valueTypes['['] = Array
valueTypes['{'] = Object
}
@ -223,7 +223,37 @@ func (iter *Iterator) unreadByte() {
return
}
func (iter *Iterator) Read() interface{} {
valueType := iter.WhatIsNext()
switch valueType {
case String:
return iter.ReadString()
case Number:
return iter.ReadFloat64()
case Nil:
iter.skipFixedBytes(4) // null
return nil
case Bool:
return iter.ReadBool()
case Array:
arr := []interface{}{}
iter.ReadArrayCB(func(iter *Iterator) bool {
arr = append(arr, iter.Read())
return true
})
return arr
case Object:
obj := map[string]interface{}{}
iter.ReadObjectCB(func(Iter *Iterator, field string) bool {
obj[field] = iter.Read()
return true
})
return obj
default:
iter.reportError("Read", fmt.Sprintf("unexpected value type: %v", valueType))
return nil
}
}
// ReadBase64 reads a json object as Base64 in byte slice
func (iter *Iterator) ReadBase64() (ret []byte) {

View File

@ -33,25 +33,15 @@ func Test_one_element(t *testing.T) {
}
func Test_two_elements(t *testing.T) {
should := require.New(t)
iter := ParseString(`[1,2]`)
cont := iter.ReadArray()
if cont != true {
t.FailNow()
}
if iter.ReadInt64() != 1 {
t.FailNow()
}
cont = iter.ReadArray()
if cont != true {
t.FailNow()
}
if iter.ReadInt64() != 2 {
t.FailNow()
}
cont = iter.ReadArray()
if cont != false {
t.FailNow()
}
should.True(iter.ReadArray())
should.Equal(int64(1), iter.ReadInt64())
should.True(iter.ReadArray())
should.Equal(int64(2), iter.ReadInt64())
should.False(iter.ReadArray())
iter = ParseString(`[1,2]`)
should.Equal([]interface{}{float64(1), float64(2)}, iter.Read())
}
func Test_invalid_array(t *testing.T) {

View File

@ -7,17 +7,17 @@ import (
)
func Test_true(t *testing.T) {
should := require.New(t)
iter := ParseString(`true`)
if iter.ReadBool() != true {
t.FailNow()
}
should.True(iter.ReadBool())
iter = ParseString(`true`)
should.Equal(true, iter.Read())
}
func Test_false(t *testing.T) {
should := require.New(t)
iter := ParseString(`false`)
if iter.ReadBool() != false {
t.FailNow()
}
should.False(iter.ReadBool())
}
func Test_write_true_false(t *testing.T) {

View File

@ -45,6 +45,12 @@ func Test_read_float(t *testing.T) {
}
}
func Test_read_float_via_read(t *testing.T) {
should := require.New(t)
iter := ParseString(`12.3`)
should.Equal(float64(12.3), iter.Read())
}
func Test_write_float32(t *testing.T) {
vals := []float32{0, 1, -1, 99, 0xff, 0xfff, 0xffff, 0xfffff, 0xffffff, 0x4ffffff, 0xfffffff,
-0x4ffffff, -0xfffffff, 1.2345, 1.23456, 1.234567, 1.001}

View File

@ -8,24 +8,22 @@ import (
)
func Test_read_map(t *testing.T) {
should := require.New(t)
iter := ParseString(`{"hello": "world"}`)
m := map[string]string{"1": "2"}
iter.ReadVal(&m)
copy(iter.buf, []byte{0, 0, 0, 0, 0, 0})
if !reflect.DeepEqual(map[string]string{"1": "2", "hello": "world"}, m) {
fmt.Println(iter.Error)
t.Fatal(m)
}
should.Equal(map[string]string{"1": "2", "hello": "world"}, m)
}
func Test_read_map_of_interface(t *testing.T) {
should := require.New(t)
iter := ParseString(`{"hello": "world"}`)
m := map[string]interface{}{"1": "2"}
iter.ReadVal(&m)
if !reflect.DeepEqual(map[string]interface{}{"1": "2", "hello": "world"}, m) {
fmt.Println(iter.Error)
t.Fatal(m)
}
should.Equal(map[string]interface{}{"1": "2", "hello": "world"}, m)
iter = ParseString(`{"hello": "world"}`)
should.Equal(map[string]interface{}{"hello": "world"}, iter.Read())
}
func Test_read_map_of_any(t *testing.T) {

View File

@ -6,11 +6,12 @@ import (
"bytes"
)
func Test_decode_null(t *testing.T) {
func Test_read_null(t *testing.T) {
should := require.New(t)
iter := ParseString(`null`)
if iter.ReadNil() != true {
t.FailNow()
}
should.True(iter.ReadNil())
iter = ParseString(`null`)
should.Nil(iter.Read())
}
func Test_write_null(t *testing.T) {

View File

@ -59,6 +59,12 @@ func Test_read_exotic_string(t *testing.T) {
}
}
func Test_read_string_via_read(t *testing.T) {
should := require.New(t)
iter := ParseString(`"hello"`)
should.Equal("hello", iter.Read())
}
func Test_write_string(t *testing.T) {
should := require.New(t)
buf := &bytes.Buffer{}