mirror of
https://github.com/json-iterator/go.git
synced 2025-04-20 11:28:49 +02:00
expose Parse from Any
This commit is contained in:
parent
4d7e181f9f
commit
97472ecd96
@ -19,6 +19,7 @@ type Any interface {
|
|||||||
GetObject() map[string]Any
|
GetObject() map[string]Any
|
||||||
SetObject(map[string]Any) bool
|
SetObject(map[string]Any) bool
|
||||||
WriteTo(stream *Stream)
|
WriteTo(stream *Stream)
|
||||||
|
Parse() *Iterator
|
||||||
}
|
}
|
||||||
|
|
||||||
type baseAny struct{}
|
type baseAny struct{}
|
||||||
|
@ -13,7 +13,7 @@ type arrayLazyAny struct {
|
|||||||
remaining []byte
|
remaining []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (any *arrayLazyAny) parse() *Iterator {
|
func (any *arrayLazyAny) Parse() *Iterator {
|
||||||
iter := any.iter
|
iter := any.iter
|
||||||
if iter == nil {
|
if iter == nil {
|
||||||
iter = NewIterator()
|
iter = NewIterator()
|
||||||
@ -37,7 +37,7 @@ func (any *arrayLazyAny) fillCacheUntil(target int) Any {
|
|||||||
if target < i {
|
if target < i {
|
||||||
return any.cache[target]
|
return any.cache[target]
|
||||||
}
|
}
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
if (len(any.remaining) == len(any.buf)) {
|
if (len(any.remaining) == len(any.buf)) {
|
||||||
iter.head++
|
iter.head++
|
||||||
c := iter.nextToken()
|
c := iter.nextToken()
|
||||||
@ -47,11 +47,13 @@ func (any *arrayLazyAny) fillCacheUntil(target int) Any {
|
|||||||
any.cache = append(any.cache, element)
|
any.cache = append(any.cache, element)
|
||||||
if target == 0 {
|
if target == 0 {
|
||||||
any.remaining = iter.buf[iter.head:]
|
any.remaining = iter.buf[iter.head:]
|
||||||
|
any.err = iter.Error
|
||||||
return element
|
return element
|
||||||
}
|
}
|
||||||
i = 1
|
i = 1
|
||||||
} else {
|
} else {
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -60,11 +62,13 @@ func (any *arrayLazyAny) fillCacheUntil(target int) Any {
|
|||||||
any.cache = append(any.cache, element)
|
any.cache = append(any.cache, element)
|
||||||
if i == target {
|
if i == target {
|
||||||
any.remaining = iter.buf[iter.head:]
|
any.remaining = iter.buf[iter.head:]
|
||||||
|
any.err = iter.Error
|
||||||
return element
|
return element
|
||||||
}
|
}
|
||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,7 +79,7 @@ func (any *arrayLazyAny) fillCache() {
|
|||||||
if any.cache == nil {
|
if any.cache == nil {
|
||||||
any.cache = make([]Any, 0, 8)
|
any.cache = make([]Any, 0, 8)
|
||||||
}
|
}
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
if len(any.remaining) == len(any.buf) {
|
if len(any.remaining) == len(any.buf) {
|
||||||
iter.head++
|
iter.head++
|
||||||
c := iter.nextToken()
|
c := iter.nextToken()
|
||||||
@ -84,6 +88,7 @@ func (any *arrayLazyAny) fillCache() {
|
|||||||
any.cache = append(any.cache, iter.readAny(iter))
|
any.cache = append(any.cache, iter.readAny(iter))
|
||||||
} else {
|
} else {
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,7 +96,7 @@ func (any *arrayLazyAny) fillCache() {
|
|||||||
any.cache = append(any.cache, iter.readAny(iter))
|
any.cache = append(any.cache, iter.readAny(iter))
|
||||||
}
|
}
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
return
|
any.err = iter.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (any *arrayLazyAny) LastError() error {
|
func (any *arrayLazyAny) LastError() error {
|
||||||
@ -185,14 +190,13 @@ func (any *arrayLazyAny) Size() int {
|
|||||||
return len(any.cache)
|
return len(any.cache)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func (any *arrayLazyAny) IterateArray() (func() (Any, bool), bool) {
|
func (any *arrayLazyAny) IterateArray() (func() (Any, bool), bool) {
|
||||||
if any.cache == nil {
|
if any.cache == nil {
|
||||||
any.cache = make([]Any, 0, 8)
|
any.cache = make([]Any, 0, 8)
|
||||||
}
|
}
|
||||||
remaining := any.remaining
|
remaining := any.remaining
|
||||||
if len(remaining) == len(any.buf) {
|
if len(remaining) == len(any.buf) {
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
iter.head++
|
iter.head++
|
||||||
c := iter.nextToken()
|
c := iter.nextToken()
|
||||||
if c != ']' {
|
if c != ']' {
|
||||||
@ -204,6 +208,7 @@ func (any *arrayLazyAny) IterateArray() (func() (Any, bool), bool) {
|
|||||||
} else {
|
} else {
|
||||||
remaining = nil
|
remaining = nil
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -234,18 +239,18 @@ func (any *arrayLazyAny) IterateArray() (func() (Any, bool), bool) {
|
|||||||
any.cache = append(any.cache, nextValue)
|
any.cache = append(any.cache, nextValue)
|
||||||
remaining = iter.buf[iter.head:]
|
remaining = iter.buf[iter.head:]
|
||||||
any.remaining = remaining
|
any.remaining = remaining
|
||||||
|
any.err = iter.Error
|
||||||
return value, true
|
return value, true
|
||||||
} else {
|
} else {
|
||||||
remaining = nil
|
remaining = nil
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return value, false
|
return value, false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, true
|
}, true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func (any *arrayLazyAny) GetArray() []Any {
|
func (any *arrayLazyAny) GetArray() []Any {
|
||||||
any.fillCache()
|
any.fillCache()
|
||||||
return any.cache
|
return any.cache
|
||||||
|
@ -40,6 +40,10 @@ func (any *trueAny) WriteTo(stream *Stream) {
|
|||||||
stream.WriteTrue()
|
stream.WriteTrue()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (any *trueAny) Parse() *Iterator {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type falseAny struct {
|
type falseAny struct {
|
||||||
baseAny
|
baseAny
|
||||||
}
|
}
|
||||||
@ -79,3 +83,7 @@ func (any *falseAny) ToString() string {
|
|||||||
func (any *falseAny) WriteTo(stream *Stream) {
|
func (any *falseAny) WriteTo(stream *Stream) {
|
||||||
stream.WriteFalse()
|
stream.WriteFalse()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (any *falseAny) Parse() *Iterator {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -13,15 +13,20 @@ type floatLazyAny struct {
|
|||||||
cache float64
|
cache float64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (any *floatLazyAny) fillCache() {
|
func (any *floatLazyAny) Parse() *Iterator {
|
||||||
if any.err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
iter := any.iter
|
iter := any.iter
|
||||||
if iter == nil {
|
if iter == nil {
|
||||||
iter = NewIterator()
|
iter = NewIterator()
|
||||||
}
|
}
|
||||||
iter.ResetBytes(any.buf)
|
iter.ResetBytes(any.buf)
|
||||||
|
return iter
|
||||||
|
}
|
||||||
|
|
||||||
|
func (any *floatLazyAny) fillCache() {
|
||||||
|
if any.err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
iter := any.Parse()
|
||||||
any.cache = iter.ReadFloat64()
|
any.cache = iter.ReadFloat64()
|
||||||
if iter.Error != io.EOF {
|
if iter.Error != io.EOF {
|
||||||
iter.reportError("floatLazyAny", "there are bytes left")
|
iter.reportError("floatLazyAny", "there are bytes left")
|
||||||
|
@ -14,15 +14,20 @@ type intLazyAny struct {
|
|||||||
cache int64
|
cache int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (any *intLazyAny) fillCache() {
|
func (any *intLazyAny) Parse() *Iterator {
|
||||||
if any.err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
iter := any.iter
|
iter := any.iter
|
||||||
if iter == nil {
|
if iter == nil {
|
||||||
iter = NewIterator()
|
iter = NewIterator()
|
||||||
}
|
}
|
||||||
iter.ResetBytes(any.buf)
|
iter.ResetBytes(any.buf)
|
||||||
|
return iter
|
||||||
|
}
|
||||||
|
|
||||||
|
func (any *intLazyAny) fillCache() {
|
||||||
|
if any.err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
iter := any.Parse()
|
||||||
any.cache = iter.ReadInt64()
|
any.cache = iter.ReadInt64()
|
||||||
if iter.Error != io.EOF {
|
if iter.Error != io.EOF {
|
||||||
iter.reportError("intLazyAny", "there are bytes left")
|
iter.reportError("intLazyAny", "there are bytes left")
|
||||||
@ -112,3 +117,7 @@ func (any *intAny) ToString() string {
|
|||||||
func (any *intAny) WriteTo(stream *Stream) {
|
func (any *intAny) WriteTo(stream *Stream) {
|
||||||
stream.WriteInt64(any.val)
|
stream.WriteInt64(any.val)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (any *intAny) Parse() *Iterator {
|
||||||
|
return nil
|
||||||
|
}
|
@ -42,3 +42,7 @@ func (any *invalidAny) WriteTo(stream *Stream) {
|
|||||||
func (any *invalidAny) Get(path ...interface{}) Any {
|
func (any *invalidAny) Get(path ...interface{}) Any {
|
||||||
return any
|
return any
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (any *invalidAny) Parse() *Iterator {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -39,3 +39,7 @@ func (any *nilAny) ToString() string {
|
|||||||
func (any *nilAny) WriteTo(stream *Stream) {
|
func (any *nilAny) WriteTo(stream *Stream) {
|
||||||
stream.WriteNil()
|
stream.WriteNil()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (any *nilAny) Parse() *Iterator {
|
||||||
|
return nil
|
||||||
|
}
|
@ -13,7 +13,7 @@ type objectLazyAny struct {
|
|||||||
remaining []byte
|
remaining []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (any *objectLazyAny) parse() *Iterator {
|
func (any *objectLazyAny) Parse() *Iterator {
|
||||||
iter := any.iter
|
iter := any.iter
|
||||||
if iter == nil {
|
if iter == nil {
|
||||||
iter = NewIterator()
|
iter = NewIterator()
|
||||||
@ -34,7 +34,7 @@ func (any *objectLazyAny) fillCacheUntil(target string) Any {
|
|||||||
if val != nil {
|
if val != nil {
|
||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
if len(any.remaining) == len(any.buf) {
|
if len(any.remaining) == len(any.buf) {
|
||||||
iter.head++
|
iter.head++
|
||||||
c := iter.nextToken()
|
c := iter.nextToken()
|
||||||
@ -45,10 +45,12 @@ func (any *objectLazyAny) fillCacheUntil(target string) Any {
|
|||||||
any.cache[k] = v
|
any.cache[k] = v
|
||||||
if target == k {
|
if target == k {
|
||||||
any.remaining = iter.buf[iter.head:]
|
any.remaining = iter.buf[iter.head:]
|
||||||
|
any.err = iter.Error
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -58,10 +60,12 @@ func (any *objectLazyAny) fillCacheUntil(target string) Any {
|
|||||||
any.cache[k] = v
|
any.cache[k] = v
|
||||||
if target == k {
|
if target == k {
|
||||||
any.remaining = iter.buf[iter.head:]
|
any.remaining = iter.buf[iter.head:]
|
||||||
|
any.err = iter.Error
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,7 +76,7 @@ func (any *objectLazyAny) fillCache() {
|
|||||||
if any.cache == nil {
|
if any.cache == nil {
|
||||||
any.cache = map[string]Any{}
|
any.cache = map[string]Any{}
|
||||||
}
|
}
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
if len(any.remaining) == len(any.buf) {
|
if len(any.remaining) == len(any.buf) {
|
||||||
iter.head++
|
iter.head++
|
||||||
c := iter.nextToken()
|
c := iter.nextToken()
|
||||||
@ -83,6 +87,7 @@ func (any *objectLazyAny) fillCache() {
|
|||||||
any.cache[k] = v
|
any.cache[k] = v
|
||||||
} else {
|
} else {
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,6 +97,7 @@ func (any *objectLazyAny) fillCache() {
|
|||||||
any.cache[k] = v
|
any.cache[k] = v
|
||||||
}
|
}
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +207,7 @@ func (any *objectLazyAny) IterateObject() (func() (string, Any, bool), bool) {
|
|||||||
}
|
}
|
||||||
remaining := any.remaining
|
remaining := any.remaining
|
||||||
if len(remaining) == len(any.buf) {
|
if len(remaining) == len(any.buf) {
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
iter.head++
|
iter.head++
|
||||||
c := iter.nextToken()
|
c := iter.nextToken()
|
||||||
if c != '}' {
|
if c != '}' {
|
||||||
@ -214,6 +220,7 @@ func (any *objectLazyAny) IterateObject() (func() (string, Any, bool), bool) {
|
|||||||
} else {
|
} else {
|
||||||
remaining = nil
|
remaining = nil
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -253,10 +260,12 @@ func (any *objectLazyAny) IterateObject() (func() (string, Any, bool), bool) {
|
|||||||
any.cache[nextKey] = nextValue
|
any.cache[nextKey] = nextValue
|
||||||
remaining = iter.buf[iter.head:]
|
remaining = iter.buf[iter.head:]
|
||||||
any.remaining = remaining
|
any.remaining = remaining
|
||||||
|
any.err = iter.Error
|
||||||
return key, value, true
|
return key, value, true
|
||||||
} else {
|
} else {
|
||||||
remaining = nil
|
remaining = nil
|
||||||
any.remaining = nil
|
any.remaining = nil
|
||||||
|
any.err = iter.Error
|
||||||
return key, value, false
|
return key, value, false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,19 +12,7 @@ type stringLazyAny struct{
|
|||||||
cache string
|
cache string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (any *stringLazyAny) fillCache() {
|
func (any *stringLazyAny) Parse() *Iterator {
|
||||||
if any.err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
iter := any.parse()
|
|
||||||
any.cache = iter.ReadString()
|
|
||||||
if iter.Error != io.EOF {
|
|
||||||
iter.reportError("stringLazyAny", "there are bytes left")
|
|
||||||
}
|
|
||||||
any.err = iter.Error
|
|
||||||
}
|
|
||||||
|
|
||||||
func (any *stringLazyAny) parse() *Iterator {
|
|
||||||
iter := any.iter
|
iter := any.iter
|
||||||
if iter == nil {
|
if iter == nil {
|
||||||
iter = NewIterator()
|
iter = NewIterator()
|
||||||
@ -34,6 +22,18 @@ func (any *stringLazyAny) parse() *Iterator {
|
|||||||
return iter
|
return iter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (any *stringLazyAny) fillCache() {
|
||||||
|
if any.err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
iter := any.Parse()
|
||||||
|
any.cache = iter.ReadString()
|
||||||
|
if iter.Error != io.EOF {
|
||||||
|
iter.reportError("stringLazyAny", "there are bytes left")
|
||||||
|
}
|
||||||
|
any.err = iter.Error
|
||||||
|
}
|
||||||
|
|
||||||
func (any *stringLazyAny) LastError() error {
|
func (any *stringLazyAny) LastError() error {
|
||||||
return any.err
|
return any.err
|
||||||
}
|
}
|
||||||
@ -54,7 +54,7 @@ func (any *stringLazyAny) ToBool() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (any *stringLazyAny) ToInt() int {
|
func (any *stringLazyAny) ToInt() int {
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
iter.head++
|
iter.head++
|
||||||
val := iter.ReadInt()
|
val := iter.ReadInt()
|
||||||
any.err = iter.Error
|
any.err = iter.Error
|
||||||
@ -62,7 +62,7 @@ func (any *stringLazyAny) ToInt() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (any *stringLazyAny) ToInt32() int32 {
|
func (any *stringLazyAny) ToInt32() int32 {
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
iter.head++
|
iter.head++
|
||||||
val := iter.ReadInt32()
|
val := iter.ReadInt32()
|
||||||
any.err = iter.Error
|
any.err = iter.Error
|
||||||
@ -70,7 +70,7 @@ func (any *stringLazyAny) ToInt32() int32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (any *stringLazyAny) ToInt64() int64 {
|
func (any *stringLazyAny) ToInt64() int64 {
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
iter.head++
|
iter.head++
|
||||||
val := iter.ReadInt64()
|
val := iter.ReadInt64()
|
||||||
any.err = iter.Error
|
any.err = iter.Error
|
||||||
@ -78,7 +78,7 @@ func (any *stringLazyAny) ToInt64() int64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (any *stringLazyAny) ToFloat32() float32 {
|
func (any *stringLazyAny) ToFloat32() float32 {
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
iter.head++
|
iter.head++
|
||||||
val := iter.ReadFloat32()
|
val := iter.ReadFloat32()
|
||||||
any.err = iter.Error
|
any.err = iter.Error
|
||||||
@ -86,7 +86,7 @@ func (any *stringLazyAny) ToFloat32() float32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (any *stringLazyAny) ToFloat64() float64 {
|
func (any *stringLazyAny) ToFloat64() float64 {
|
||||||
iter := any.parse()
|
iter := any.Parse()
|
||||||
iter.head++
|
iter.head++
|
||||||
val := iter.ReadFloat64()
|
val := iter.ReadFloat64()
|
||||||
any.err = iter.Error
|
any.err = iter.Error
|
||||||
|
Loading…
x
Reference in New Issue
Block a user