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  }