JsonUtil.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package Utils
  2. import (
  3. "bytes"
  4. "encoding/gob"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/json-iterator/go"
  8. "reflect"
  9. "github.com/astaxie/beego/logs"
  10. "github.com/ugorji/go/codec"
  11. )
  12. var jsonIter = jsoniter.ConfigCompatibleWithStandardLibrary
  13. func ToJson(obj interface{}) ([]byte, error) {
  14. return json.Marshal(obj)
  15. }
  16. func FromJson(data []byte, t interface{}) error {
  17. return json.Unmarshal(data, t)
  18. }
  19. func ToJsonIterator(obj interface{}) ([]byte, error) {
  20. return jsonIter.Marshal(obj)
  21. }
  22. func FromJsonIterator(data []byte, t interface{}) error {
  23. return jsonIter.Unmarshal(data, t)
  24. }
  25. func MsgpEncode(obj interface{}) []byte {
  26. var mh codec.MsgpackHandle
  27. mh.MapType = reflect.TypeOf(obj)
  28. var buf bytes.Buffer
  29. enc := codec.NewEncoder(&buf, &mh)
  30. err := enc.Encode(obj)
  31. if err == nil {
  32. return buf.Bytes()
  33. } else {
  34. logs.Error(err)
  35. return nil
  36. }
  37. }
  38. func MsgpDecode(data []byte, obj interface{}) error {
  39. var mh codec.MsgpackHandle
  40. mh.MapType = reflect.TypeOf(obj)
  41. dec := codec.NewDecoder(bytes.NewReader(data), &mh)
  42. err := dec.Decode(&obj)
  43. return err
  44. }
  45. func DeepCopy(dst, src interface{}) error {
  46. var buf bytes.Buffer
  47. if err := gob.NewEncoder(&buf).Encode(src); err != nil {
  48. return err
  49. }
  50. return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
  51. }
  52. func ShowObjAllProp(obj interface{}) {
  53. value_method := reflect.ValueOf(obj)
  54. obj_type := value_method.Type()
  55. fmt.Printf("输出对象的属性和方法\t%v\n", obj)
  56. fmt.Println("\tMethods...")
  57. for i := 0; i < value_method.NumMethod(); i++ {
  58. fmt.Printf("\t%d\t%s\n", i, obj_type.Method(i).Name)
  59. }
  60. value_element := reflect.ValueOf(obj).Elem()
  61. obj_element := value_element.Type()
  62. fmt.Println("\tFields...")
  63. for i := 0; i < value_element.NumField(); i++ {
  64. fmt.Printf("\t%d\t%s\n", i, obj_element.Field(i).Name)
  65. }
  66. }
粤ICP备19079148号