github.com/godaddy-x/freego@v1.0.156/utils/jsonlib.go (about) 1 package utils 2 3 import ( 4 "bytes" 5 "errors" 6 "fmt" 7 jsonIterator "github.com/json-iterator/go" 8 "github.com/valyala/fastjson" 9 ) 10 11 var json = jsonIterator.ConfigCompatibleWithStandardLibrary 12 13 // 对象转JSON字符串 14 func JsonMarshal(v interface{}) ([]byte, error) { 15 if v == nil { 16 return nil, errors.New("data is nil") 17 } 18 return json.Marshal(v) 19 } 20 21 // 校验JSON格式是否合法 22 func JsonValid(b []byte) bool { 23 //return json.Valid(b) // fastjson > default json 2倍 24 if err := fastjson.ValidateBytes(b); err != nil { 25 return false 26 } 27 return true 28 } 29 30 // 校验JSON格式是否合法 31 func JsonValidString(s string) bool { 32 if err := fastjson.Validate(s); err != nil { 33 return false 34 } 35 return true 36 } 37 38 // JSON字符串转对象 39 func JsonUnmarshal(data []byte, v interface{}) error { 40 if data == nil || len(data) == 0 { 41 return nil 42 } 43 if !JsonValid(data) { 44 return errors.New("JSON format invalid") 45 } 46 buf := bytes.NewBuffer(data) 47 d := json.NewDecoder(buf) 48 d.UseNumber() 49 if err := d.Decode(v); err != nil { 50 return err 51 } 52 buf.Reset() 53 return nil 54 } 55 56 func GetJsonString(b []byte, k string) string { 57 return fastjson.GetString(b, k) 58 } 59 60 func GetJsonInt(b []byte, k string) int { 61 return fastjson.GetInt(b, k) 62 } 63 64 func GetJsonInt64(b []byte, k string) int64 { 65 return int64(GetJsonInt(b, k)) 66 } 67 68 func GetJsonBool(b []byte, k string) bool { 69 return fastjson.GetBool(b, k) 70 } 71 72 func GetJsonFloat64(b []byte, k string) float64 { 73 return fastjson.GetFloat64(b, k) 74 } 75 76 func GetJsonBytes(b []byte, k string) []byte { 77 return fastjson.GetBytes(b, k) 78 } 79 80 func GetJsonObjectBytes(b []byte, k string) []byte { 81 value := GetJsonObjectValue(b) 82 if value == nil { 83 return nil 84 } 85 v := value.Get(k) 86 if v == nil { 87 return nil 88 } 89 return v.MarshalTo(nil) 90 } 91 92 func GetJsonObjectString(b []byte, k string) string { 93 return Bytes2Str(GetJsonObjectBytes(b, k)) 94 } 95 96 // GetJsonObjectValue 例如: v.Get("a").Get("b").MarshalTo(nil) 97 func GetJsonObjectValue(b []byte) *fastjson.Value { 98 var p fastjson.Parser 99 v, err := p.ParseBytes(b) 100 if err != nil { 101 fmt.Println("parsing json error:", err) 102 return nil 103 } 104 return v 105 }