mirror of
https://github.com/json-iterator/go.git
synced 2025-04-20 11:28:49 +02:00
move json number impl
This commit is contained in:
parent
c99d73acd0
commit
6327145300
@ -1,31 +0,0 @@
|
|||||||
package jsoniter
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Number string
|
|
||||||
|
|
||||||
// String returns the literal text of the number.
|
|
||||||
func (n Number) String() string { return string(n) }
|
|
||||||
|
|
||||||
// Float64 returns the number as a float64.
|
|
||||||
func (n Number) Float64() (float64, error) {
|
|
||||||
return strconv.ParseFloat(string(n), 64)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64 returns the number as an int64.
|
|
||||||
func (n Number) Int64() (int64, error) {
|
|
||||||
return strconv.ParseInt(string(n), 10, 64)
|
|
||||||
}
|
|
||||||
|
|
||||||
func CastJsonNumber(val interface{}) (string, bool) {
|
|
||||||
switch typedVal := val.(type) {
|
|
||||||
case json.Number:
|
|
||||||
return string(typedVal), true
|
|
||||||
case Number:
|
|
||||||
return string(typedVal), true
|
|
||||||
}
|
|
||||||
return "", false
|
|
||||||
}
|
|
24
reflect.go
24
reflect.go
@ -36,8 +36,6 @@ type checkIsEmpty interface {
|
|||||||
IsEmpty(ptr unsafe.Pointer) bool
|
IsEmpty(ptr unsafe.Pointer) bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var jsonNumberType reflect.Type
|
|
||||||
var jsoniterNumberType reflect.Type
|
|
||||||
var jsonRawMessageType reflect.Type
|
var jsonRawMessageType reflect.Type
|
||||||
var jsoniterRawMessageType reflect.Type
|
var jsoniterRawMessageType reflect.Type
|
||||||
var anyType reflect.Type
|
var anyType reflect.Type
|
||||||
@ -47,8 +45,6 @@ var textMarshalerType reflect.Type
|
|||||||
var textUnmarshalerType reflect.Type
|
var textUnmarshalerType reflect.Type
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem()
|
|
||||||
jsoniterNumberType = reflect.TypeOf((*Number)(nil)).Elem()
|
|
||||||
jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
|
jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
|
||||||
jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
|
jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
|
||||||
anyType = reflect.TypeOf((*Any)(nil)).Elem()
|
anyType = reflect.TypeOf((*Any)(nil)).Elem()
|
||||||
@ -116,13 +112,11 @@ func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
|
|||||||
if typ == jsoniterRawMessageType {
|
if typ == jsoniterRawMessageType {
|
||||||
return &jsoniterRawMessageCodec{}
|
return &jsoniterRawMessageCodec{}
|
||||||
}
|
}
|
||||||
if typ.AssignableTo(jsonNumberType) {
|
decoder := createDecoderOfJsonNumber(cfg, prefix, typ)
|
||||||
return &jsonNumberCodec{}
|
if decoder != nil {
|
||||||
|
return decoder
|
||||||
}
|
}
|
||||||
if typ.AssignableTo(jsoniterNumberType) {
|
decoder = createDecoderOfMarshaler(cfg, prefix, typ)
|
||||||
return &jsoniterNumberCodec{}
|
|
||||||
}
|
|
||||||
decoder := createDecoderOfMarshaler(cfg, prefix, typ)
|
|
||||||
if decoder != nil {
|
if decoder != nil {
|
||||||
return decoder
|
return decoder
|
||||||
}
|
}
|
||||||
@ -307,13 +301,11 @@ func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
|
|||||||
if typ == jsoniterRawMessageType {
|
if typ == jsoniterRawMessageType {
|
||||||
return &jsoniterRawMessageCodec{}
|
return &jsoniterRawMessageCodec{}
|
||||||
}
|
}
|
||||||
if typ.AssignableTo(jsonNumberType) {
|
encoder := createEncoderOfJsonNumber(cfg, prefix, typ)
|
||||||
return &jsonNumberCodec{}
|
if encoder != nil {
|
||||||
|
return encoder
|
||||||
}
|
}
|
||||||
if typ.AssignableTo(jsoniterNumberType) {
|
encoder = createEncoderOfMarshaler(cfg, prefix, typ)
|
||||||
return &jsoniterNumberCodec{}
|
|
||||||
}
|
|
||||||
encoder := createEncoderOfMarshaler(cfg, prefix, typ)
|
|
||||||
if encoder != nil {
|
if encoder != nil {
|
||||||
return encoder
|
return encoder
|
||||||
}
|
}
|
||||||
|
112
reflect_json_number.go
Normal file
112
reflect_json_number.go
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
package jsoniter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"strconv"
|
||||||
|
"unsafe"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Number string
|
||||||
|
|
||||||
|
// String returns the literal text of the number.
|
||||||
|
func (n Number) String() string { return string(n) }
|
||||||
|
|
||||||
|
// Float64 returns the number as a float64.
|
||||||
|
func (n Number) Float64() (float64, error) {
|
||||||
|
return strconv.ParseFloat(string(n), 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64 returns the number as an int64.
|
||||||
|
func (n Number) Int64() (int64, error) {
|
||||||
|
return strconv.ParseInt(string(n), 10, 64)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CastJsonNumber(val interface{}) (string, bool) {
|
||||||
|
switch typedVal := val.(type) {
|
||||||
|
case json.Number:
|
||||||
|
return string(typedVal), true
|
||||||
|
case Number:
|
||||||
|
return string(typedVal), true
|
||||||
|
}
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
|
var jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem()
|
||||||
|
var jsoniterNumberType = reflect.TypeOf((*Number)(nil)).Elem()
|
||||||
|
|
||||||
|
func createDecoderOfJsonNumber(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
|
||||||
|
if typ.AssignableTo(jsonNumberType) {
|
||||||
|
return &jsonNumberCodec{}
|
||||||
|
}
|
||||||
|
if typ.AssignableTo(jsoniterNumberType) {
|
||||||
|
return &jsoniterNumberCodec{}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func createEncoderOfJsonNumber(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
|
||||||
|
if typ.AssignableTo(jsonNumberType) {
|
||||||
|
return &jsonNumberCodec{}
|
||||||
|
}
|
||||||
|
if typ.AssignableTo(jsoniterNumberType) {
|
||||||
|
return &jsoniterNumberCodec{}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type jsonNumberCodec struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
||||||
|
switch iter.WhatIsNext() {
|
||||||
|
case StringValue:
|
||||||
|
*((*json.Number)(ptr)) = json.Number(iter.ReadString())
|
||||||
|
case NilValue:
|
||||||
|
iter.skipFourBytes('n', 'u', 'l', 'l')
|
||||||
|
*((*json.Number)(ptr)) = ""
|
||||||
|
default:
|
||||||
|
*((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
|
||||||
|
number := *((*json.Number)(ptr))
|
||||||
|
if len(number) == 0 {
|
||||||
|
stream.writeByte('0')
|
||||||
|
} else {
|
||||||
|
stream.WriteRaw(string(number))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
|
||||||
|
return len(*((*json.Number)(ptr))) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type jsoniterNumberCodec struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
||||||
|
switch iter.WhatIsNext() {
|
||||||
|
case StringValue:
|
||||||
|
*((*Number)(ptr)) = Number(iter.ReadString())
|
||||||
|
case NilValue:
|
||||||
|
iter.skipFourBytes('n', 'u', 'l', 'l')
|
||||||
|
*((*Number)(ptr)) = ""
|
||||||
|
default:
|
||||||
|
*((*Number)(ptr)) = Number([]byte(iter.readNumberAsString()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
|
||||||
|
number := *((*Number)(ptr))
|
||||||
|
if len(number) == 0 {
|
||||||
|
stream.writeByte('0')
|
||||||
|
} else {
|
||||||
|
stream.WriteRaw(string(number))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
|
||||||
|
return len(*((*Number)(ptr))) == 0
|
||||||
|
}
|
@ -369,62 +369,6 @@ func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool {
|
|||||||
return encoder.valType.UnsafeIndirect(ptr) == nil
|
return encoder.valType.UnsafeIndirect(ptr) == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type jsonNumberCodec struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
|
||||||
switch iter.WhatIsNext() {
|
|
||||||
case StringValue:
|
|
||||||
*((*json.Number)(ptr)) = json.Number(iter.ReadString())
|
|
||||||
case NilValue:
|
|
||||||
iter.skipFourBytes('n', 'u', 'l', 'l')
|
|
||||||
*((*json.Number)(ptr)) = ""
|
|
||||||
default:
|
|
||||||
*((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
|
|
||||||
number := *((*json.Number)(ptr))
|
|
||||||
if len(number) == 0 {
|
|
||||||
stream.writeByte('0')
|
|
||||||
} else {
|
|
||||||
stream.WriteRaw(string(number))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
|
|
||||||
return len(*((*json.Number)(ptr))) == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
type jsoniterNumberCodec struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
|
|
||||||
switch iter.WhatIsNext() {
|
|
||||||
case StringValue:
|
|
||||||
*((*Number)(ptr)) = Number(iter.ReadString())
|
|
||||||
case NilValue:
|
|
||||||
iter.skipFourBytes('n', 'u', 'l', 'l')
|
|
||||||
*((*Number)(ptr)) = ""
|
|
||||||
default:
|
|
||||||
*((*Number)(ptr)) = Number([]byte(iter.readNumberAsString()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
|
|
||||||
number := *((*Number)(ptr))
|
|
||||||
if len(number) == 0 {
|
|
||||||
stream.writeByte('0')
|
|
||||||
} else {
|
|
||||||
stream.WriteRaw(string(number))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {
|
|
||||||
return len(*((*Number)(ptr))) == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
type jsonRawMessageCodec struct {
|
type jsonRawMessageCodec struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user