Encoding
encoding/json: omitemptyは数値のゼロ値を省略する
omitemptyを付けたintは0のときJSONから消えるため、0と未指定を区別できません。
Sourceomitempty.go
Go 1.22
package encodingexample
import "encoding/json"
type Summary struct {
Name string `json:"name"`
Count int `json:"count,omitempty"`
}
func Marshal(summary Summary) (string, error) {
encoded, err := json.Marshal(summary)
return string(encoded), err
}Testomitempty_test.go
Go 1.22
package encodingexample
import "testing"
func TestOmitEmptyは数値のゼロ値をJSONから省略する(t *testing.T) {
emptyCount, err := Marshal(Summary{Name: "go"})
if err != nil {
t.Fatal(err)
}
countOne, err := Marshal(Summary{Name: "go", Count: 1})
if err != nil {
t.Fatal(err)
}
if emptyCount != `{"name":"go"}` || countOne != `{"name":"go","count":1}` {
t.Fatalf("empty = %s, one = %s", emptyCount, countOne)
}
}01Assertion
このテストで確認できること
- Countが0のstructはcountキーを出力しない
- Countが1ならcountキーを出力する
0を有効な業務値として送信するJSONでは、omitempty付きの値型を安易に使いません。必要に応じてポインタや独自のnullable型を使います。
OBSERVED RESULT
Count: 0 → {"name":"go"}
Count: 1 → {"name":"go","count":1}