any_str.go (2893B)
1 package jsoniter 2 3 import ( 4 "fmt" 5 "strconv" 6 ) 7 8 type stringAny struct { 9 baseAny 10 val string 11 } 12 13 func (any *stringAny) Get(path ...interface{}) Any { 14 if len(path) == 0 { 15 return any 16 } 17 return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} 18 } 19 20 func (any *stringAny) Parse() *Iterator { 21 return nil 22 } 23 24 func (any *stringAny) ValueType() ValueType { 25 return StringValue 26 } 27 28 func (any *stringAny) MustBeValid() Any { 29 return any 30 } 31 32 func (any *stringAny) LastError() error { 33 return nil 34 } 35 36 func (any *stringAny) ToBool() bool { 37 str := any.ToString() 38 if str == "0" { 39 return false 40 } 41 for _, c := range str { 42 switch c { 43 case ' ', '\n', '\r', '\t': 44 default: 45 return true 46 } 47 } 48 return false 49 } 50 51 func (any *stringAny) ToInt() int { 52 return int(any.ToInt64()) 53 54 } 55 56 func (any *stringAny) ToInt32() int32 { 57 return int32(any.ToInt64()) 58 } 59 60 func (any *stringAny) ToInt64() int64 { 61 if any.val == "" { 62 return 0 63 } 64 65 flag := 1 66 startPos := 0 67 if any.val[0] == '+' || any.val[0] == '-' { 68 startPos = 1 69 } 70 71 if any.val[0] == '-' { 72 flag = -1 73 } 74 75 endPos := startPos 76 for i := startPos; i < len(any.val); i++ { 77 if any.val[i] >= '0' && any.val[i] <= '9' { 78 endPos = i + 1 79 } else { 80 break 81 } 82 } 83 parsed, _ := strconv.ParseInt(any.val[startPos:endPos], 10, 64) 84 return int64(flag) * parsed 85 } 86 87 func (any *stringAny) ToUint() uint { 88 return uint(any.ToUint64()) 89 } 90 91 func (any *stringAny) ToUint32() uint32 { 92 return uint32(any.ToUint64()) 93 } 94 95 func (any *stringAny) ToUint64() uint64 { 96 if any.val == "" { 97 return 0 98 } 99 100 startPos := 0 101 102 if any.val[0] == '-' { 103 return 0 104 } 105 if any.val[0] == '+' { 106 startPos = 1 107 } 108 109 endPos := startPos 110 for i := startPos; i < len(any.val); i++ { 111 if any.val[i] >= '0' && any.val[i] <= '9' { 112 endPos = i + 1 113 } else { 114 break 115 } 116 } 117 parsed, _ := strconv.ParseUint(any.val[startPos:endPos], 10, 64) 118 return parsed 119 } 120 121 func (any *stringAny) ToFloat32() float32 { 122 return float32(any.ToFloat64()) 123 } 124 125 func (any *stringAny) ToFloat64() float64 { 126 if len(any.val) == 0 { 127 return 0 128 } 129 130 // first char invalid 131 if any.val[0] != '+' && any.val[0] != '-' && (any.val[0] > '9' || any.val[0] < '0') { 132 return 0 133 } 134 135 // extract valid num expression from string 136 // eg 123true => 123, -12.12xxa => -12.12 137 endPos := 1 138 for i := 1; i < len(any.val); i++ { 139 if any.val[i] == '.' || any.val[i] == 'e' || any.val[i] == 'E' || any.val[i] == '+' || any.val[i] == '-' { 140 endPos = i + 1 141 continue 142 } 143 144 // end position is the first char which is not digit 145 if any.val[i] >= '0' && any.val[i] <= '9' { 146 endPos = i + 1 147 } else { 148 endPos = i 149 break 150 } 151 } 152 parsed, _ := strconv.ParseFloat(any.val[:endPos], 64) 153 return parsed 154 } 155 156 func (any *stringAny) ToString() string { 157 return any.val 158 } 159 160 func (any *stringAny) WriteTo(stream *Stream) { 161 stream.WriteString(any.val) 162 } 163 164 func (any *stringAny) GetInterface() interface{} { 165 return any.val 166 }