-
Notifications
You must be signed in to change notification settings - Fork 0
/
deserializer.go
79 lines (65 loc) · 1.81 KB
/
deserializer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package betcd
import (
"github.com/grpc-boot/base"
)
const (
String = "string"
Json = "json"
Yaml = "yaml"
)
// KeyOption Key配置
type KeyOption struct {
Key string `json:"key" yaml:"key"`
Type string `json:"type" yaml:"type"`
Deserialize Deserialize
}
// Deserialize 反序列化函数
type Deserialize func(data []byte) (value interface{}, err error)
// Deserializer 反序列化工具
type Deserializer interface {
// Deserialize 反序列化
Deserialize(key string, val []byte) (value interface{}, err error)
}
// NewDeserializer 实例化反序列化工具对象
func NewDeserializer(options map[string]KeyOption) Deserializer {
return &deserializer{keyOptions: options}
}
type deserializer struct {
keyOptions map[string]KeyOption
}
func (d *deserializer) Deserialize(key string, val []byte) (value interface{}, err error) {
if len(d.keyOptions) < 1 {
return val, err
}
if option, exists := d.keyOptions[key]; exists {
//优先使用自定义解析
if option.Deserialize != nil {
return option.Deserialize(val)
}
switch option.Type {
case Json:
return JsonMapDeserialize(val)
case Yaml:
return YamlMapDeserialize(val)
case String:
return StringDeserialize(val)
}
}
return val, err
}
// JsonMapDeserialize Json反序列化为map[string]interface{}
func JsonMapDeserialize(data []byte) (value interface{}, err error) {
var val map[string]interface{}
err = base.JsonDecode(data, &val)
return val, err
}
// YamlMapDeserialize Yaml反序列化为map[string]interface{}
func YamlMapDeserialize(data []byte) (value interface{}, err error) {
var val map[string]interface{}
err = base.YamlDecode(data, &val)
return val, err
}
// StringDeserialize 字符串
func StringDeserialize(data []byte) (value interface{}, err error) {
return base.Bytes2String(data), nil
}