1
0
mirror of https://github.com/json-iterator/go.git synced 2025-01-23 18:54:21 +02:00

#145 interface {} customizatoin is recursive

This commit is contained in:
Tao Wen 2017-08-22 10:39:01 +08:00
parent 39e9d67807
commit cdbd2ed810
2 changed files with 22 additions and 23 deletions

View File

@ -285,14 +285,18 @@ func (iter *Iterator) Read() interface{} {
case ArrayValue:
arr := []interface{}{}
iter.ReadArrayCB(func(iter *Iterator) bool {
arr = append(arr, iter.Read())
var elem interface{}
iter.ReadVal(&elem)
arr = append(arr, elem)
return true
})
return arr
case ObjectValue:
obj := map[string]interface{}{}
iter.ReadMapCB(func(Iter *Iterator, field string) bool {
obj[field] = iter.Read()
var elem interface{}
iter.ReadVal(&elem)
obj[field] = elem
return true
})
return obj

View File

@ -286,27 +286,6 @@ func Test_marshal_json_with_time(t *testing.T) {
should.NotNil(obj.TF1.F2)
}
func Test_unmarshal_empty_interface_as_int64(t *testing.T) {
var obj interface{}
RegisterTypeDecoderFunc("interface {}", func(ptr unsafe.Pointer, iter *Iterator) {
switch iter.WhatIsNext() {
case NumberValue:
*(*interface{})(ptr) = iter.ReadInt64()
default:
*(*interface{})(ptr) = iter.Read()
}
})
should := require.New(t)
Unmarshal([]byte("100"), &obj)
should.Equal(int64(100), obj)
Unmarshal([]byte(`"hello"`), &obj)
should.Equal("hello", obj)
var arr []interface{}
Unmarshal([]byte("[100]"), &arr)
should.Equal(int64(100), arr[0])
}
func Test_customize_tag_key(t *testing.T) {
type TestObject struct {
@ -318,4 +297,20 @@ func Test_customize_tag_key(t *testing.T) {
str, err := json.MarshalToString(TestObject{"hello"})
should.Nil(err)
should.Equal(`{"field":"hello"}`, str)
}
func Test_recursive_empty_interface_customization(t *testing.T) {
t.Skip()
var obj interface{}
RegisterTypeDecoderFunc("interface {}", func(ptr unsafe.Pointer, iter *Iterator) {
switch iter.WhatIsNext() {
case NumberValue:
*(*interface{})(ptr) = iter.ReadInt64()
default:
*(*interface{})(ptr) = iter.Read()
}
})
should := require.New(t)
Unmarshal([]byte("[100]"), &obj)
should.Equal([]interface{}{int64(100)}, obj)
}