From 514db10f970a54b9b2cdb3511bc7f9f1cb45cede Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Mon, 19 Jun 2017 15:40:00 +0800 Subject: [PATCH] add Any.ToVal --- feature_any.go | 8 ++++++++ feature_any_array.go | 6 ++++++ feature_any_object.go | 6 ++++++ jsoniter_any_array_test.go | 3 +++ jsoniter_any_object_test.go | 5 +++++ 5 files changed, 28 insertions(+) diff --git a/feature_any.go b/feature_any.go index 3f14e77..f3eaa6f 100644 --- a/feature_any.go +++ b/feature_any.go @@ -19,10 +19,14 @@ type Any interface { ToFloat32() float32 ToFloat64() float64 ToString() string + ToVal(val interface{}) Get(path ...interface{}) Any + // TODO: add Set Size() int Keys() []string + // TODO: remove me GetArray() []Any + // TODO: remove me GetObject() map[string]Any GetInterface() interface{} WriteTo(stream *Stream) @@ -50,6 +54,10 @@ func (any *baseAny) GetObject() map[string]Any { return map[string]Any{} } +func (any *baseAny) ToVal(obj interface{}) { + panic("not implemented") +} + func WrapInt32(val int32) Any { return &int32Any{baseAny{}, val} } diff --git a/feature_any_array.go b/feature_any_array.go index 743bcd8..34eded9 100644 --- a/feature_any_array.go +++ b/feature_any_array.go @@ -94,6 +94,12 @@ func (any *arrayLazyAny) ToString() string { return *(*string)(unsafe.Pointer(&any.buf)) } +func (any *arrayLazyAny) ToVal(val interface{}) { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + iter.ReadVal(val) +} + func (any *arrayLazyAny) Get(path ...interface{}) Any { if len(path) == 0 { return any diff --git a/feature_any_object.go b/feature_any_object.go index ba4b37c..0d5cada 100644 --- a/feature_any_object.go +++ b/feature_any_object.go @@ -94,6 +94,12 @@ func (any *objectLazyAny) ToString() string { return *(*string)(unsafe.Pointer(&any.buf)) } +func (any *objectLazyAny) ToVal(obj interface{}) { + iter := any.cfg.BorrowIterator(any.buf) + defer any.cfg.ReturnIterator(iter) + iter.ReadVal(obj) +} + func (any *objectLazyAny) Get(path ...interface{}) Any { if len(path) == 0 { return any diff --git a/jsoniter_any_array_test.go b/jsoniter_any_array_test.go index 64aa984..0ce3f84 100644 --- a/jsoniter_any_array_test.go +++ b/jsoniter_any_array_test.go @@ -41,6 +41,9 @@ func Test_read_two_element_array_as_any(t *testing.T) { stream := NewStream(ConfigDefault, nil, 32) any.WriteTo(stream) should.Equal("[1,2]", string(stream.Buffer())) + arr := []int{} + any.ToVal(&arr) + should.Equal([]int{1, 2}, arr) } func Test_wrap_array(t *testing.T) { diff --git a/jsoniter_any_object_test.go b/jsoniter_any_object_test.go index 1d52a34..03de5a6 100644 --- a/jsoniter_any_object_test.go +++ b/jsoniter_any_object_test.go @@ -22,6 +22,11 @@ func Test_read_object_as_any(t *testing.T) { should.Equal(Object, any.ValueType()) should.Nil(any.LastError()) should.Equal("b", any.GetObject()["a"].ToString()) + obj := struct { + A string + }{} + any.ToVal(&obj) + should.Equal("b", obj.A) } func Test_object_lazy_any_get(t *testing.T) {