소스 검색

add Any.ToVal

Tao Wen 8 년 전
부모
커밋
514db10f97
5개의 변경된 파일28개의 추가작업 그리고 0개의 파일을 삭제
  1. 8 0
      feature_any.go
  2. 6 0
      feature_any_array.go
  3. 6 0
      feature_any_object.go
  4. 3 0
      jsoniter_any_array_test.go
  5. 5 0
      jsoniter_any_object_test.go

+ 8 - 0
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}
 }

+ 6 - 0
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

+ 6 - 0
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

+ 3 - 0
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) {

+ 5 - 0
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) {