json.go 1.1 KB

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