json.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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 any) ([]byte, error) {
  11. return json.Marshal(v)
  12. }
  13. // MarshalToString marshals v into a string.
  14. func MarshalToString(v any) (string, error) {
  15. data, err := Marshal(v)
  16. if err != nil {
  17. return "", err
  18. }
  19. return string(data), nil
  20. }
  21. // Unmarshal unmarshals data bytes into v.
  22. func Unmarshal(data []byte, v any) error {
  23. decoder := json.NewDecoder(bytes.NewReader(data))
  24. if err := unmarshalUseNumber(decoder, v); err != nil {
  25. return formatError(string(data), err)
  26. }
  27. return nil
  28. }
  29. // UnmarshalFromString unmarshals v from str.
  30. func UnmarshalFromString(str string, v any) error {
  31. decoder := json.NewDecoder(strings.NewReader(str))
  32. if err := unmarshalUseNumber(decoder, v); err != nil {
  33. return formatError(str, err)
  34. }
  35. return nil
  36. }
  37. // UnmarshalFromReader unmarshals v from reader.
  38. func UnmarshalFromReader(reader io.Reader, v any) error {
  39. var buf strings.Builder
  40. teeReader := io.TeeReader(reader, &buf)
  41. decoder := json.NewDecoder(teeReader)
  42. if err := unmarshalUseNumber(decoder, v); err != nil {
  43. return formatError(buf.String(), err)
  44. }
  45. return nil
  46. }
  47. func unmarshalUseNumber(decoder *json.Decoder, v any) error {
  48. decoder.UseNumber()
  49. return decoder.Decode(v)
  50. }
  51. func formatError(v string, err error) error {
  52. return fmt.Errorf("string: `%s`, error: `%w`", v, err)
  53. }