values.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package dto
  2. import (
  3. "encoding/json"
  4. "strconv"
  5. )
  6. type StringValue string
  7. func (s *StringValue) UnmarshalJSON(data []byte) error {
  8. var str string
  9. if err := json.Unmarshal(data, &str); err == nil {
  10. *s = StringValue(str)
  11. return nil
  12. }
  13. var raw json.Number
  14. if err := json.Unmarshal(data, &raw); err == nil {
  15. *s = StringValue(raw.String())
  16. return nil
  17. }
  18. return json.Unmarshal(data, &str)
  19. }
  20. func (s StringValue) MarshalJSON() ([]byte, error) {
  21. return json.Marshal(string(s))
  22. }
  23. type IntValue int
  24. func (i *IntValue) UnmarshalJSON(b []byte) error {
  25. var n int
  26. if err := json.Unmarshal(b, &n); err == nil {
  27. *i = IntValue(n)
  28. return nil
  29. }
  30. var s string
  31. if err := json.Unmarshal(b, &s); err != nil {
  32. return err
  33. }
  34. v, err := strconv.Atoi(s)
  35. if err != nil {
  36. return err
  37. }
  38. *i = IntValue(v)
  39. return nil
  40. }
  41. func (i IntValue) MarshalJSON() ([]byte, error) {
  42. return json.Marshal(int(i))
  43. }
  44. type BoolValue bool
  45. func (b *BoolValue) UnmarshalJSON(data []byte) error {
  46. var boolean bool
  47. if err := json.Unmarshal(data, &boolean); err == nil {
  48. *b = BoolValue(boolean)
  49. return nil
  50. }
  51. var str string
  52. if err := json.Unmarshal(data, &str); err != nil {
  53. return err
  54. }
  55. if str == "true" {
  56. *b = BoolValue(true)
  57. } else if str == "false" {
  58. *b = BoolValue(false)
  59. } else {
  60. return json.Unmarshal(data, &boolean)
  61. }
  62. return nil
  63. }
  64. func (b BoolValue) MarshalJSON() ([]byte, error) {
  65. return json.Marshal(bool(b))
  66. }