github.com/lingyao2333/mo-zero@v1.4.1/core/jsonx/json.go (about)

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