jsonflex.go 835 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package qiyuesuosdk
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strconv"
  6. )
  7. // flexStringID 兼容契约锁部分接口将大整数 id 以 JSON 字符串返回的情况。
  8. type flexStringID string
  9. func (f *flexStringID) UnmarshalJSON(data []byte) error {
  10. if len(data) == 0 || string(data) == "null" {
  11. *f = ""
  12. return nil
  13. }
  14. switch data[0] {
  15. case '"':
  16. var s string
  17. if err := json.Unmarshal(data, &s); err != nil {
  18. return err
  19. }
  20. *f = flexStringID(s)
  21. return nil
  22. default:
  23. var n json.Number
  24. if err := json.Unmarshal(data, &n); err != nil {
  25. return err
  26. }
  27. *f = flexStringID(n.String())
  28. return nil
  29. }
  30. }
  31. func (f flexStringID) String() string {
  32. return string(f)
  33. }
  34. func (f flexStringID) Int64() (int64, error) {
  35. s := f.String()
  36. if s == "" {
  37. return 0, fmt.Errorf("empty id")
  38. }
  39. return strconv.ParseInt(s, 10, 64)
  40. }