1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- // +build go1.1
- package simplejson
- import (
- "bytes"
- "encoding/json"
- "errors"
- "io"
- "reflect"
- "strconv"
- )
- // Implements the json.Unmarshaler interface.
- func (j *Json) UnmarshalJSON(p []byte) error {
- dec := json.NewDecoder(bytes.NewBuffer(p))
- dec.UseNumber()
- return dec.Decode(&j.data)
- }
- // NewFromReader returns a *Json by decoding from an io.Reader
- func NewFromReader(r io.Reader) (*Json, error) {
- j := new(Json)
- dec := json.NewDecoder(r)
- dec.UseNumber()
- err := dec.Decode(&j.data)
- return j, err
- }
- // Float64 coerces into a float64
- func (j *Json) Float64() (float64, error) {
- switch j.data.(type) {
- case json.Number:
- return j.data.(json.Number).Float64()
- case float32, float64:
- return reflect.ValueOf(j.data).Float(), nil
- case int, int8, int16, int32, int64:
- return float64(reflect.ValueOf(j.data).Int()), nil
- case uint, uint8, uint16, uint32, uint64:
- return float64(reflect.ValueOf(j.data).Uint()), nil
- }
- return 0, errors.New("invalid value type")
- }
- // Int coerces into an int
- func (j *Json) Int() (int, error) {
- switch j.data.(type) {
- case json.Number:
- i, err := j.data.(json.Number).Int64()
- return int(i), err
- case float32, float64:
- return int(reflect.ValueOf(j.data).Float()), nil
- case int, int8, int16, int32, int64:
- return int(reflect.ValueOf(j.data).Int()), nil
- case uint, uint8, uint16, uint32, uint64:
- return int(reflect.ValueOf(j.data).Uint()), nil
- }
- return 0, errors.New("invalid value type")
- }
- // Int64 coerces into an int64
- func (j *Json) Int64() (int64, error) {
- switch j.data.(type) {
- case json.Number:
- return j.data.(json.Number).Int64()
- case float32, float64:
- return int64(reflect.ValueOf(j.data).Float()), nil
- case int, int8, int16, int32, int64:
- return reflect.ValueOf(j.data).Int(), nil
- case uint, uint8, uint16, uint32, uint64:
- return int64(reflect.ValueOf(j.data).Uint()), nil
- }
- return 0, errors.New("invalid value type")
- }
- // Uint64 coerces into an uint64
- func (j *Json) Uint64() (uint64, error) {
- switch j.data.(type) {
- case json.Number:
- return strconv.ParseUint(j.data.(json.Number).String(), 10, 64)
- case float32, float64:
- return uint64(reflect.ValueOf(j.data).Float()), nil
- case int, int8, int16, int32, int64:
- return uint64(reflect.ValueOf(j.data).Int()), nil
- case uint, uint8, uint16, uint32, uint64:
- return reflect.ValueOf(j.data).Uint(), nil
- }
- return 0, errors.New("invalid value type")
- }
|