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  }