@@ -15,12 +15,17 @@ import (
1515)
1616
1717type 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+
2227 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"`
2429}
2530
2631func TestOptionalToJson (t * testing.T ) {
@@ -32,7 +37,7 @@ func TestOptionalToJson(t *testing.T) {
3237 {
3338 name : "empty" ,
3439 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}` ,
3641 },
3742 {
3843 name : "some" ,
@@ -44,12 +49,12 @@ func TestOptionalToJson(t *testing.T) {
4449 OptTwoBool : optional .None [bool ](),
4550 OptTwoString : optional .None [string ](),
4651 },
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}` ,
4853 },
4954 }
5055 for _ , tc := range tests {
5156 t .Run (tc .name , func (t * testing.T ) {
52- b , err := json .Marshal (tc .obj )
57+ b , err := json .MarshalKeepOptionalEmpty (tc .obj )
5358 assert .NoError (t , err )
5459 assert .Equal (t , tc .want , string (b ), "gitea json module returned unexpected" )
5560
@@ -75,7 +80,7 @@ func TestOptionalFromJson(t *testing.T) {
7580 },
7681 {
7782 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}` ,
7984 want : testSerializationStruct {
8085 NormalString : "a string" ,
8186 NormalBool : true ,
@@ -169,7 +174,7 @@ normal_bool: true
169174optional_bool: false
170175optional_string: ""
171176optional_two_bool: null
172- optional_twostring : null
177+ optional_two_string : null
173178` ,
174179 want : testSerializationStruct {
175180 NormalString : "a string" ,
0 commit comments