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