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 }