浏览代码

implement Any WriteTo

Tao Wen 8 年之前
父节点
当前提交
4d7e181f9f
共有 10 个文件被更改,包括 38 次插入9 次删除
  1. 0 3
      feature_any.go
  2. 11 3
      feature_any_array.go
  3. 8 0
      feature_any_bool.go
  4. 4 0
      feature_any_float.go
  5. 1 1
      feature_any_int.go
  6. 3 0
      feature_any_invalid.go
  7. 5 1
      feature_any_nil.go
  8. 1 1
      feature_any_object.go
  9. 4 0
      feature_any_string.go
  10. 1 0
      jsoniter_array_test.go

+ 0 - 3
feature_any.go

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

+ 11 - 3
feature_any_array.go

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

+ 8 - 0
feature_any_bool.go

@@ -36,6 +36,10 @@ func (any *trueAny) ToString() string {
 	return "true"
 	return "true"
 }
 }
 
 
+func (any *trueAny) WriteTo(stream *Stream) {
+	stream.WriteTrue()
+}
+
 type falseAny struct {
 type falseAny struct {
 	baseAny
 	baseAny
 }
 }
@@ -71,3 +75,7 @@ func (any *falseAny) ToFloat64() float64 {
 func (any *falseAny) ToString() string {
 func (any *falseAny) ToString() string {
 	return "false"
 	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 {
 func (any *floatLazyAny) ToString() string {
 	return *(*string)(unsafe.Pointer(&any.buf))
 	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) {
 func (any *intLazyAny) WriteTo(stream *Stream) {
-	stream.WriteRaw(*(*string)(unsafe.Pointer(&any.buf)))
+	stream.Write(any.buf)
 }
 }
 
 
 type intAny struct {
 type intAny struct {

+ 3 - 0
feature_any_invalid.go

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

+ 5 - 1
feature_any_nil.go

@@ -33,5 +33,9 @@ func (any *nilAny) ToFloat64() float64 {
 }
 }
 
 
 func (any *nilAny) ToString() string {
 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) {
 func (any *objectLazyAny) WriteTo(stream *Stream) {
 	if len(any.remaining) == len(any.buf) {
 	if len(any.remaining) == len(any.buf) {
 		// nothing has been parsed yet
 		// nothing has been parsed yet
-		stream.WriteRaw(*(*string)(unsafe.Pointer(&any.buf)))
+		stream.Write(any.buf)
 	} else {
 	} else {
 		any.fillCache()
 		any.fillCache()
 		stream.WriteVal(any.cache)
 		stream.WriteVal(any.cache)

+ 4 - 0
feature_any_string.go

@@ -96,4 +96,8 @@ func (any *stringLazyAny) ToFloat64() float64 {
 func (any *stringLazyAny) ToString() string {
 func (any *stringLazyAny) ToString() string {
 	any.fillCache()
 	any.fillCache()
 	return any.cache
 	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]")
 	any, err := UnmarshalAnyFromString("[1,[2,3],4]")
 	should.Nil(err)
 	should.Nil(err)
 	should.Equal(3, any.Get(1,1).ToInt())
 	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) {
 func Test_array_lazy_any_set(t *testing.T) {