@@ -3,6 +3,7 @@ package extra
3
3
import (
4
4
"github.com/json-iterator/go"
5
5
"unicode"
6
+ "strings"
6
7
)
7
8
8
9
// SupportPrivateFields include private fields when encoding/decoding
@@ -18,8 +19,37 @@ func (extension *privateFieldsExtension) UpdateStructDescriptor(structDescriptor
18
19
for _ , binding := range structDescriptor .Fields {
19
20
isPrivate := unicode .IsLower (rune (binding .Field .Name ()[0 ]))
20
21
if isPrivate {
21
- binding .FromNames = []string {binding .Field .Name ()}
22
- binding .ToNames = []string {binding .Field .Name ()}
22
+ tag , hastag := binding .Field .Tag ().Lookup ("json" )
23
+ if ! hastag {
24
+ binding .FromNames = []string {binding .Field .Name ()}
25
+ binding .ToNames = []string {binding .Field .Name ()}
26
+ continue
27
+ }
28
+ tagParts := strings .Split (tag , "," )
29
+ names := calcFieldNames (binding .Field .Name (), tagParts [0 ], tag )
30
+ binding .FromNames = names
31
+ binding .ToNames = names
23
32
}
24
33
}
25
34
}
35
+
36
+ func calcFieldNames (originalFieldName string , tagProvidedFieldName string , wholeTag string ) []string {
37
+ // ignore?
38
+ if wholeTag == "-" {
39
+ return []string {}
40
+ }
41
+ // rename?
42
+ var fieldNames []string
43
+ if tagProvidedFieldName == "" {
44
+ fieldNames = []string {originalFieldName }
45
+ } else {
46
+ fieldNames = []string {tagProvidedFieldName }
47
+ }
48
+ // private?
49
+ isNotExported := unicode .IsLower (rune (originalFieldName [0 ]))
50
+ if isNotExported {
51
+ fieldNames = []string {}
52
+ }
53
+ return fieldNames
54
+ }
55
+
0 commit comments