json.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package jsonx
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "strings"
  8. )
  9. // Marshal marshals v into json bytes.
  10. func Marshal(v interface{}) ([]byte, error) {
  11. return json.Marshal(v)
  12. }
  13. // Unmarshal unmarshals data bytes into v.
  14. func Unmarshal(data []byte, v interface{}) error {
  15. decoder := json.NewDecoder(bytes.NewReader(data))
  16. if err := unmarshalUseNumber(decoder, v); err != nil {
  17. return formatError(string(data), err)
  18. }
  19. return nil
  20. }
  21. // UnmarshalFromString unmarshals v from str.
  22. func UnmarshalFromString(str string, v interface{}) error {
  23. decoder := json.NewDecoder(strings.NewReader(str))
  24. if err := unmarshalUseNumber(decoder, v); err != nil {
  25. return formatError(str, err)
  26. }
  27. return nil
  28. }
  29. // UnmarshalFromReader unmarshals v from reader.
  30. func UnmarshalFromReader(reader io.Reader, v interface{}) error {
  31. var buf strings.Builder
  32. teeReader := io.TeeReader(reader, &buf)
  33. decoder := json.NewDecoder(teeReader)
  34. if err := unmarshalUseNumber(decoder, v); err != nil {
  35. return formatError(buf.String(), err)
  36. }
  37. return nil
  38. }
  39. func unmarshalUseNumber(decoder *json.Decoder, v interface{}) error {
  40. decoder.UseNumber()
  41. return decoder.Decode(v)
  42. }
  43. func formatError(v string, err error) error {
  44. return fmt.Errorf("string: `%s`, error: `%s`", v, err.Error())
  45. }