diff --git a/feature_any.go b/feature_any.go index 7ded0d3..41b86cf 100644 --- a/feature_any.go +++ b/feature_any.go @@ -72,6 +72,10 @@ func WrapFloat64(val float64) Any { return &floatAny{baseAny{}, val} } +func WrapString(val string) Any { + return &stringAny{baseAny{}, nil, val} +} + func (iter *Iterator) ReadAny() Any { return iter.readAny(nil) } diff --git a/feature_any_string.go b/feature_any_string.go index d53889f..f7a04e8 100644 --- a/feature_any_string.go +++ b/feature_any_string.go @@ -2,6 +2,7 @@ package jsoniter import ( "io" + "strconv" ) type stringLazyAny struct{ @@ -109,4 +110,80 @@ func (any *stringLazyAny) WriteTo(stream *Stream) { func (any *stringLazyAny) GetInterface() interface{} { any.fillCache() return any.cache +} + +type stringAny struct{ + baseAny + err error + val string +} + +func (any *stringAny) Parse() *Iterator { + return nil +} + + +func (any *stringAny) ValueType() ValueType { + return String +} + +func (any *stringAny) LastError() error { + return any.err +} + +func (any *stringAny) ToBool() bool { + str := any.ToString() + if str == "false" { + return false + } + for _, c := range str { + switch c { + case ' ', '\n', '\r', '\t': + default: + return true + } + } + return false +} + +func (any *stringAny) ToInt() int { + parsed, err := strconv.ParseInt(any.val, 10, 64) + any.err = err + return int(parsed) +} + +func (any *stringAny) ToInt32() int32 { + parsed, err := strconv.ParseInt(any.val, 10, 32) + any.err = err + return int32(parsed) +} + +func (any *stringAny) ToInt64() int64 { + parsed, err := strconv.ParseInt(any.val, 10, 64) + any.err = err + return parsed +} + +func (any *stringAny) ToFloat32() float32 { + parsed, err := strconv.ParseFloat(any.val, 32) + any.err = err + return float32(parsed) +} + +func (any *stringAny) ToFloat64() float64 { + parsed, err := strconv.ParseFloat(any.val, 64) + any.err = err + return parsed +} + +func (any *stringAny) ToString() string { + return any.val +} + +func (any *stringAny) WriteTo(stream *Stream) { + stream.WriteString(any.val) +} + +func (any *stringAny) GetInterface() interface{} { + return any.val } \ No newline at end of file diff --git a/jsoniter_string_test.go b/jsoniter_string_test.go index f134afa..7a96ded 100644 --- a/jsoniter_string_test.go +++ b/jsoniter_string_test.go @@ -79,6 +79,12 @@ func Test_read_string_as_any(t *testing.T) { should.Equal(123, any.ToInt()) } +func Test_wrap_string(t *testing.T) { + should := require.New(t) + any := WrapString("123") + should.Equal(123, any.ToInt()) +} + func Test_write_string(t *testing.T) { should := require.New(t) str, err := MarshalToString("hello")