1
0
mirror of https://github.com/json-iterator/go.git synced 2024-11-24 08:22:14 +02:00
json-iterator/feature_any.go
2017-01-23 08:33:43 +08:00

86 lines
1.8 KiB
Go

package jsoniter
import "fmt"
type Any interface {
LastError() error
ToBool() bool
ToInt() int
ToInt32() int32
ToInt64() int64
ToFloat32() float32
ToFloat64() float64
ToString() string
}
func (iter *Iterator) ReadAny() Any {
valueType := iter.WhatIsNext()
switch valueType {
case Nil:
iter.skipFixedBytes(4)
return &nilAny{}
case Number:
return iter.readNumberAny()
case String:
return iter.readStringAny()
}
iter.reportError("ReadAny", fmt.Sprintf("unexpected value type: %v", valueType))
return &invalidAny{}
}
func (iter *Iterator) readNumberAny() Any {
dotFound := false
var lazyBuf []byte
for {
for i := iter.head; i < iter.tail; i++ {
c := iter.buf[i]
if c == '.' {
dotFound = true
continue
}
switch c {
case ' ', '\n', '\r', '\t', ',', '}', ']':
lazyBuf = append(lazyBuf, iter.buf[iter.head:i]...)
iter.head = i
if dotFound {
return &floatLazyAny{lazyBuf, nil, nil, 0}
} else {
return &intLazyAny{lazyBuf, nil, nil, 0}
}
}
}
lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
if !iter.loadMore() {
iter.head = iter.tail
if dotFound {
return &floatLazyAny{lazyBuf, nil, nil, 0}
} else {
return &intLazyAny{lazyBuf, nil, nil, 0}
}
}
}
}
func (iter *Iterator) readStringAny() Any {
iter.head++
lazyBuf := make([]byte, 1, 8)
lazyBuf[0] = '"'
for {
end, escaped := iter.findStringEnd()
if end == -1 {
lazyBuf = append(lazyBuf, iter.buf[iter.head:iter.tail]...)
if !iter.loadMore() {
iter.reportError("readStringAny", "incomplete string")
return &invalidAny{}
}
if escaped {
iter.head = 1 // skip the first char as last char read is \
}
} else {
lazyBuf = append(lazyBuf, iter.buf[iter.head:end]...)
iter.head = end
return &stringLazyAny{lazyBuf, nil, nil, ""}
}
}
}