@@ -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