github.com/eframework-cn/EP.GO.UTIL@v1.0.0/xjson/xjson.go (about) 1 //-----------------------------------------------------------------------// 2 // GNU GENERAL PUBLIC LICENSE // 3 // Version 2, June 1991 // 4 // // 5 // Copyright (C) EFramework, https://eframework.cn, All rights reserved. // 6 // Everyone is permitted to copy and distribute verbatim copies // 7 // of this license document, but changing it is not allowed. // 8 // SEE LICENSE.md FOR MORE DETAILS. // 9 //-----------------------------------------------------------------------// 10 11 // 提供对json序列化/反序列化的支持. 12 package xjson 13 14 import ( 15 "bytes" 16 "encoding/json" 17 "errors" 18 "fmt" 19 20 "github.com/eframework-cn/EP.GO.UTIL/xstring" 21 ) 22 23 var ( 24 TO_OBJ_INVALID_PARAM = errors.New("xjson.ToObj invalid param") // 错误:不合法的参数 25 TO_OBJ_PARSE_ERROR = errors.New("xjson.ToObj parse content fail") // 错误:解析内容失败 26 TO_OBJ_UNSUPPORT_DATA = errors.New("xjson.ToObj unsupport type") // 错误:不支持的类型 27 ) 28 29 func encodeNoEscape(v interface{}) ([]byte, error) { 30 switch v.(type) { 31 case string: 32 return xstring.StrToBytes(v.(string)), nil 33 } 34 buff := bytes.NewBuffer([]byte{}) 35 encoder := json.NewEncoder(buff) 36 encoder.SetEscapeHTML(false) 37 if e := encoder.Encode(v); e != nil { 38 return nil, e 39 } 40 bytes := buff.Bytes() 41 size := len(bytes) 42 if bytes[size-1] == 10 { // 去除换行符 43 bytes = append(bytes[:size-1]) 44 } 45 return bytes, nil 46 } 47 48 // 对象转字符串输出 49 func ToPrint(v interface{}) string { 50 str, _ := ToString(v) 51 return str 52 } 53 54 // 对象转字符串 55 func ToString(v interface{}) (string, error) { 56 b, e := encodeNoEscape(v) 57 if e != nil { 58 return "", fmt.Errorf("xjson.ToString: %v", e) 59 } 60 return xstring.BytesToStr(b), nil 61 } 62 63 // 对象转字节数组 64 func ToByte(v interface{}) ([]byte, error) { 65 b, e := encodeNoEscape(v) 66 if e != nil { 67 return nil, fmt.Errorf("xjson.ToByte: %v", e) 68 } 69 return b, nil 70 } 71 72 // 字符串/字节数组转对象(指针) 73 func ToObj(data interface{}, obj interface{}) error { 74 if data == nil || obj == nil { 75 return TO_OBJ_INVALID_PARAM 76 } 77 switch data.(type) { 78 case string: 79 str := data.(string) 80 if str == "null" { 81 return nil 82 } 83 if e := json.Unmarshal(xstring.StrToBytes(str), obj); e != nil { 84 return e 85 } 86 return nil 87 case []byte: 88 str := xstring.BytesToStr(data.([]byte)) 89 if str == "null" { 90 return nil 91 } 92 if e := json.Unmarshal(data.([]byte), obj); e != nil { 93 return e 94 } 95 return nil 96 } 97 return TO_OBJ_UNSUPPORT_DATA 98 }