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 }