1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- package jsonx
- import (
- "bytes"
- "encoding/json"
- "fmt"
- "io"
- "strings"
- )
- // Marshal marshals v into json bytes.
- func Marshal(v any) ([]byte, error) {
- return json.Marshal(v)
- }
- // MarshalToString marshals v into a string.
- func MarshalToString(v any) (string, error) {
- data, err := Marshal(v)
- if err != nil {
- return "", err
- }
- return string(data), nil
- }
- // Unmarshal unmarshals data bytes into v.
- func Unmarshal(data []byte, v any) error {
- decoder := json.NewDecoder(bytes.NewReader(data))
- if err := unmarshalUseNumber(decoder, v); err != nil {
- return formatError(string(data), err)
- }
- return nil
- }
- // UnmarshalFromString unmarshals v from str.
- func UnmarshalFromString(str string, v any) error {
- decoder := json.NewDecoder(strings.NewReader(str))
- if err := unmarshalUseNumber(decoder, v); err != nil {
- return formatError(str, err)
- }
- return nil
- }
- // UnmarshalFromReader unmarshals v from reader.
- func UnmarshalFromReader(reader io.Reader, v any) error {
- var buf strings.Builder
- teeReader := io.TeeReader(reader, &buf)
- decoder := json.NewDecoder(teeReader)
- if err := unmarshalUseNumber(decoder, v); err != nil {
- return formatError(buf.String(), err)
- }
- return nil
- }
- func unmarshalUseNumber(decoder *json.Decoder, v any) error {
- decoder.UseNumber()
- return decoder.Decode(v)
- }
- func formatError(v string, err error) error {
- return fmt.Errorf("string: `%s`, error: `%w`", v, err)
- }
|