github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/bitly/go-simplejson/simplejson_go11.go (about)

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