Ver Fonte

implement Any WriteTo

Tao Wen há 8 anos atrás
pai
commit
4d7e181f9f

+ 0 - 3
feature_any.go

@@ -59,9 +59,6 @@ func (any *baseAny) SetObject(map[string]Any) bool {
 	return false
 }
 
-func (any *baseAny) WriteTo(stream *Stream) {
-}
-
 func WrapInt64(val int64) Any {
 	return &intAny{baseAny{}, nil, val}
 }

+ 11 - 3
feature_any_array.go

@@ -95,7 +95,7 @@ func (any *arrayLazyAny) fillCache() {
 }
 
 func (any *arrayLazyAny) LastError() error {
-	return nil
+	return any.err
 }
 
 func (any *arrayLazyAny) ToBool() bool {
@@ -156,7 +156,15 @@ func (any *arrayLazyAny) ToFloat64() float64 {
 }
 
 func (any *arrayLazyAny) ToString() string {
-	return ""
+	if len(any.remaining) == len(any.buf) {
+		// nothing has been parsed yet
+		return *(*string)(unsafe.Pointer(&any.buf))
+	} else {
+		any.fillCache()
+		str, err := MarshalToString(any.cache)
+		any.err = err
+		return str
+	}
 }
 
 func (any *arrayLazyAny) Get(path ...interface{}) Any {
@@ -252,7 +260,7 @@ func (any *arrayLazyAny) SetArray(newList []Any) bool {
 func (any *arrayLazyAny) WriteTo(stream *Stream) {
 	if len(any.remaining) == len(any.buf) {
 		// nothing has been parsed yet
-		stream.WriteRaw(*(*string)(unsafe.Pointer(&any.buf)))
+		stream.Write(any.buf)
 	} else {
 		any.fillCache()
 		stream.WriteVal(any.cache)

+ 8 - 0
feature_any_bool.go

@@ -36,6 +36,10 @@ func (any *trueAny) ToString() string {
 	return "true"
 }
 
+func (any *trueAny) WriteTo(stream *Stream) {
+	stream.WriteTrue()
+}
+
 type falseAny struct {
 	baseAny
 }
@@ -71,3 +75,7 @@ func (any *falseAny) ToFloat64() float64 {
 func (any *falseAny) ToString() string {
 	return "false"
 }
+
+func (any *falseAny) WriteTo(stream *Stream) {
+	stream.WriteFalse()
+}

+ 4 - 0
feature_any_float.go

@@ -64,4 +64,8 @@ func (any *floatLazyAny) ToFloat64() float64 {
 
 func (any *floatLazyAny) ToString() string {
 	return *(*string)(unsafe.Pointer(&any.buf))
+}
+
+func (any *floatLazyAny) WriteTo(stream *Stream) {
+	stream.Write(any.buf)
 }

+ 1 - 1
feature_any_int.go

@@ -68,7 +68,7 @@ func (any *intLazyAny) ToString() string {
 }
 
 func (any *intLazyAny) WriteTo(stream *Stream) {
-	stream.WriteRaw(*(*string)(unsafe.Pointer(&any.buf)))
+	stream.Write(any.buf)
 }
 
 type intAny struct {

+ 3 - 0
feature_any_invalid.go

@@ -36,6 +36,9 @@ func (any *invalidAny) ToString() string {
 	return ""
 }
 
+func (any *invalidAny) WriteTo(stream *Stream) {
+}
+
 func (any *invalidAny) Get(path ...interface{}) Any {
 	return any
 }

+ 5 - 1
feature_any_nil.go

@@ -33,5 +33,9 @@ func (any *nilAny) ToFloat64() float64 {
 }
 
 func (any *nilAny) ToString() string {
-	return ""
+	return "nil"
+}
+
+func (any *nilAny) WriteTo(stream *Stream) {
+	stream.WriteNil()
 }

+ 1 - 1
feature_any_object.go

@@ -277,7 +277,7 @@ func (any *objectLazyAny) SetObject(val map[string]Any) bool {
 func (any *objectLazyAny) WriteTo(stream *Stream) {
 	if len(any.remaining) == len(any.buf) {
 		// nothing has been parsed yet
-		stream.WriteRaw(*(*string)(unsafe.Pointer(&any.buf)))
+		stream.Write(any.buf)
 	} else {
 		any.fillCache()
 		stream.WriteVal(any.cache)

+ 4 - 0
feature_any_string.go

@@ -96,4 +96,8 @@ func (any *stringLazyAny) ToFloat64() float64 {
 func (any *stringLazyAny) ToString() string {
 	any.fillCache()
 	return any.cache
+}
+
+func (any *stringLazyAny) WriteTo(stream *Stream) {
+	stream.Write(any.buf)
 }

+ 1 - 0
jsoniter_array_test.go

@@ -87,6 +87,7 @@ func Test_array_lazy_any_get(t *testing.T) {
 	any, err := UnmarshalAnyFromString("[1,[2,3],4]")
 	should.Nil(err)
 	should.Equal(3, any.Get(1,1).ToInt())
+	should.Equal("[1,[2,3],4]", any.ToString())
 }
 
 func Test_array_lazy_any_set(t *testing.T) {