@@ -15,12 +15,17 @@ import (
15
15
)
16
16
17
17
type testSerializationStruct struct {
18
- NormalString string `json:"normal_string" yaml:"normal_string"`
19
- NormalBool bool `json:"normal_bool" yaml:"normal_bool"`
20
- OptBool optional.Option [bool ] `json:"optional_bool,omitempty" yaml:"optional_bool,omitempty"`
21
- OptString optional.Option [string ] `json:"optional_string,omitempty" yaml:"optional_string,omitempty"`
18
+ NormalString string `json:"normal_string" yaml:"normal_string"`
19
+ NormalBool bool `json:"normal_bool" yaml:"normal_bool"`
20
+ OptBool optional.Option [bool ] `json:"optional_bool,omitempty" yaml:"optional_bool,omitempty"`
21
+
22
+ // It causes an undefined behavior: should the "omitempty" tag only omit "null", or also the empty string?
23
+ // The behavior is inconsistent between json and v2 packages, and there is no such use case in Gitea.
24
+ // If anyone really needs it, they can use json.MarshalKeepOptionalEmpty to revert the v1 behavior
25
+ OptString optional.Option [string ] `json:"optional_string,omitempty" yaml:"optional_string,omitempty"`
26
+
22
27
OptTwoBool optional.Option [bool ] `json:"optional_two_bool" yaml:"optional_two_bool"`
23
- OptTwoString optional.Option [string ] `json:"optional_twostring " yaml:"optional_two_string"`
28
+ OptTwoString optional.Option [string ] `json:"optional_two_string " yaml:"optional_two_string"`
24
29
}
25
30
26
31
func TestOptionalToJson (t * testing.T ) {
@@ -32,7 +37,7 @@ func TestOptionalToJson(t *testing.T) {
32
37
{
33
38
name : "empty" ,
34
39
obj : new (testSerializationStruct ),
35
- want : `{"normal_string":"","normal_bool":false,"optional_two_bool":null,"optional_twostring ":null}` ,
40
+ want : `{"normal_string":"","normal_bool":false,"optional_two_bool":null,"optional_two_string ":null}` ,
36
41
},
37
42
{
38
43
name : "some" ,
@@ -44,12 +49,12 @@ func TestOptionalToJson(t *testing.T) {
44
49
OptTwoBool : optional .None [bool ](),
45
50
OptTwoString : optional .None [string ](),
46
51
},
47
- want : `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_twostring ":null}` ,
52
+ want : `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_two_string ":null}` ,
48
53
},
49
54
}
50
55
for _ , tc := range tests {
51
56
t .Run (tc .name , func (t * testing.T ) {
52
- b , err := json .Marshal (tc .obj )
57
+ b , err := json .MarshalKeepOptionalEmpty (tc .obj )
53
58
assert .NoError (t , err )
54
59
assert .Equal (t , tc .want , string (b ), "gitea json module returned unexpected" )
55
60
@@ -75,7 +80,7 @@ func TestOptionalFromJson(t *testing.T) {
75
80
},
76
81
{
77
82
name : "some" ,
78
- data : `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_twostring ":null}` ,
83
+ data : `{"normal_string":"a string","normal_bool":true,"optional_bool":false,"optional_string":"","optional_two_bool":null,"optional_two_string ":null}` ,
79
84
want : testSerializationStruct {
80
85
NormalString : "a string" ,
81
86
NormalBool : true ,
@@ -169,7 +174,7 @@ normal_bool: true
169
174
optional_bool: false
170
175
optional_string: ""
171
176
optional_two_bool: null
172
- optional_twostring : null
177
+ optional_two_string : null
173
178
` ,
174
179
want : testSerializationStruct {
175
180
NormalString : "a string" ,
0 commit comments