-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjson.go
More file actions
87 lines (82 loc) · 3 KB
/
Copy pathjson.go
File metadata and controls
87 lines (82 loc) · 3 KB
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
80
81
82
83
84
85
86
87
package jsoncase
//TransformVal transform all fieldName of map[string]interface embedded in the interface{} using the transformation function
func TransformVal(transformation func(string) string) func(json interface{}) interface{} {
var TransformFieldName func(val interface{}) interface{}
TransformFieldName = func(val interface{}) interface{} {
switch val.(type) {
case map[string]interface{}:
realVal := val.(map[string]interface{})
thisVal := make(map[string]interface{}, len(realVal))
for key, value := range realVal {
thisVal[transformation(key)] = TransformFieldName(value)
}
return thisVal
case []interface{}:
realVal := val.([]interface{})
thisVal := make([]interface{}, len(realVal))
for idx, elem := range realVal {
thisVal[idx] = TransformFieldName(elem)
}
return thisVal
case []map[string]interface{}:
realVal := val.([]map[string]interface{})
thisVal := make([]map[string]interface{}, len(realVal))
for idx, elem := range realVal {
thisVal[idx] = TransformFieldName(elem).(map[string]interface{})
}
return thisVal
default:
return val
}
}
return TransformFieldName
}
//TransformMap transform fieldName of all map[string]interface embedded in the root map using the transformation function.
func TransformMap(transformation func(string) string) func(json map[string]interface{}) map[string]interface{} {
var TransformFieldName func(json map[string]interface{}) map[string]interface{}
TransformFieldName = func(json map[string]interface{}) map[string]interface{} {
res := make(map[string]interface{}, len(json))
for key, val := range json {
newVal := val
switch val.(type) {
case map[string]interface{}:
realVal := val.(map[string]interface{})
newVal = TransformFieldName(realVal)
case []interface{}:
realVal := val.([]interface{})
thisVal := make([]interface{}, len(realVal))
for idx, elem := range realVal {
switch elem.(type) {
case map[string]interface{}:
thisVal[idx] = TransformFieldName(elem.(map[string]interface{}))
default:
thisVal[idx] = elem
}
}
newVal = thisVal
case []map[string]interface{}:
realVal := val.([]map[string]interface{})
thisVal := make([]map[string]interface{}, len(realVal))
for idx, elem := range realVal {
thisVal[idx] = TransformFieldName(elem)
}
newVal = thisVal
}
res[transformation(key)] = newVal
}
return res
}
return TransformFieldName
}
//ToSnakeVal transform all fieldName of map[string]interface embedded in the interface{} to snake_case
func ToSnakeVal(json interface{}) interface{} {
return TransformVal(toSnakeString)(json)
}
//ToCamelVal transform all fieldName of map[string]interface embedded in the interface{} to camelCase
func ToCamelVal(json interface{}) interface{} {
return TransformVal(toCamelString)(json)
}
//ToPascalVal transform all fieldName of map[string]interface embedded in the interface{} to PascalCase
func ToPascalVal(json interface{}) interface{} {
return TransformVal(toPascalString)(json)
}