simplejson_go11.go 2.4 KB

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