github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/bitly/go-simplejson/simplejson_go10.go (about) 1 // +build !go1.1 2 3 package simplejson 4 5 import ( 6 "encoding/json" 7 "errors" 8 "io" 9 "reflect" 10 ) 11 12 // NewFromReader returns a *Json by decoding from an io.Reader 13 func NewFromReader(r io.Reader) (*Json, error) { 14 j := new(Json) 15 dec := json.NewDecoder(r) 16 err := dec.Decode(&j.data) 17 return j, err 18 } 19 20 // Implements the json.Unmarshaler interface. 21 func (j *Json) UnmarshalJSON(p []byte) error { 22 return json.Unmarshal(p, &j.data) 23 } 24 25 // Float64 coerces into a float64 26 func (j *Json) Float64() (float64, error) { 27 switch j.data.(type) { 28 case float32, float64: 29 return reflect.ValueOf(j.data).Float(), nil 30 case int, int8, int16, int32, int64: 31 return float64(reflect.ValueOf(j.data).Int()), nil 32 case uint, uint8, uint16, uint32, uint64: 33 return float64(reflect.ValueOf(j.data).Uint()), nil 34 } 35 return 0, errors.New("invalid value type") 36 } 37 38 // Int coerces into an int 39 func (j *Json) Int() (int, error) { 40 switch j.data.(type) { 41 case float32, float64: 42 return int(reflect.ValueOf(j.data).Float()), nil 43 case int, int8, int16, int32, int64: 44 return int(reflect.ValueOf(j.data).Int()), nil 45 case uint, uint8, uint16, uint32, uint64: 46 return int(reflect.ValueOf(j.data).Uint()), nil 47 } 48 return 0, errors.New("invalid value type") 49 } 50 51 // Int64 coerces into an int64 52 func (j *Json) Int64() (int64, error) { 53 switch j.data.(type) { 54 case float32, float64: 55 return int64(reflect.ValueOf(j.data).Float()), nil 56 case int, int8, int16, int32, int64: 57 return reflect.ValueOf(j.data).Int(), nil 58 case uint, uint8, uint16, uint32, uint64: 59 return int64(reflect.ValueOf(j.data).Uint()), nil 60 } 61 return 0, errors.New("invalid value type") 62 } 63 64 // Uint64 coerces into an uint64 65 func (j *Json) Uint64() (uint64, error) { 66 switch j.data.(type) { 67 case float32, float64: 68 return uint64(reflect.ValueOf(j.data).Float()), nil 69 case int, int8, int16, int32, int64: 70 return uint64(reflect.ValueOf(j.data).Int()), nil 71 case uint, uint8, uint16, uint32, uint64: 72 return reflect.ValueOf(j.data).Uint(), nil 73 } 74 return 0, errors.New("invalid value type") 75 }