網站首頁 編程語言 正文
前言
在嘗試將結構體序列化為 Json 時,你可能會遇到 “omitempty” 標記,本小記就來淺看一下它如何起作用。
先上結論:
- 基本類型的默認值會被 omit,除了數組。
- 指針類型為 nil 時會被 omit。
Talk is cheap. Show me the code.
package main import ( "encoding/json" "errors" "fmt" ) type TestNotOmitEmpty struct { Uint8 uint8 `json:"uint8"` Uint16 uint16 `json:"uint16"` Uint32 uint32 `json:"uint32"` Uint64 uint64 `json:"uint64"` Int8 int8 `json:"int8"` Int16 int16 `json:"int16"` Int32 int32 `json:"int32"` Int64 int64 `json:"int64"` Int int `json:"int"` Float32 float32 `json:"float32"` Float64 float64 `json:"float64"` // Complex64 complex64 `json:"complex64"` // json: unsupported type // Complex128 complex128 `json:"complex128"` // json: unsupported type Byte byte `json:"byte"` Rune rune `json:"rune"` Uintptr uintptr `json:"uintptr"` String string `json:"string"` StringPointer *string `json:"stringPointer"` Array [10]int `json:"array"` Slice []int `json:"slice"` Map map[int]string `json:"map"` // Channel chan int `json:"channel"` // json: unsupported type Interface interface{} `json:"interface"` Error error `json:"error"` } type TestOmitEmptyWithDefaultValue struct { Uint8 uint8 `json:"uint8,omitempty"` Uint16 uint16 `json:"uint16,omitempty"` Uint32 uint32 `json:"uint32,omitempty"` Uint64 uint64 `json:"uint64,omitempty"` Int8 int8 `json:"int8,omitempty"` Int16 int16 `json:"int16,omitempty"` Int32 int32 `json:"int32,omitempty"` Int64 int64 `json:"int64,omitempty"` Int int `json:"int,omitempty"` Float32 float32 `json:"float32,omitempty"` Float64 float64 `json:"float64,omitempty"` // Complex64 complex64 `json:"complex64,omitempty"` // json: unsupported type // Complex128 complex128 `json:"complex128,omitempty"` // json: unsupported type Byte byte `json:"byte,omitempty"` Rune rune `json:"rune,omitempty"` Uintptr uintptr `json:"uintptr,omitempty"` String string `json:"string,omitempty"` StringPointer *string `json:"stringPointer,omitempty"` Array [10]int `json:"array,omitempty"` Slice []int `json:"slice,omitempty"` Map map[int]string `json:"map,omitempty"` // Channel chan int `json:"channel,omitempty"` // json: unsupported type Interface interface{} `json:"interface,omitempty"` Error error `json:"error,omitempty"` } func ToStringPointer(s string) *string { return &s } func main() { testOmitEmpty := TestNotOmitEmpty{} jsonData, err := json.Marshal(testOmitEmpty) if err != nil { println(err) panic(err) } fmt.Printf("TestNotOmitEmpty: %s\n", jsonData) testOmitEmptyWithDefaultValue := TestOmitEmptyWithDefaultValue{} jsonData2, err := json.Marshal(testOmitEmptyWithDefaultValue) if err != nil { println(err) panic(err) } fmt.Printf("TestOmitEmptyWithDefaultValue: %s\n", jsonData2) testOmitEmptyWithDefaultValueButFatherSet := TestOmitEmptyWithDefaultValue{ Uint8: 0, Uint16: 0, Uint32: 0, Uint64: 0, Int8: 0, Int16: 0, Int32: 0, Int64: 0, Int: 0, Float32: 0, Float64: 0, Byte: 0, Rune: 0, Uintptr: 0, String: "", StringPointer: nil, Array: [10]int{}, Slice: nil, Map: nil, Interface: nil, Error: nil, } jsonData3, err := json.Marshal(testOmitEmptyWithDefaultValueButFatherSet) if err != nil { println(err) panic(err) } fmt.Printf("testOmitEmptyWithDefaultValueButFatherSet: %s\n", jsonData3) testOmitEmptyWithNotDefaultValueButFatherSet := TestOmitEmptyWithDefaultValue{ Uint8: 1, Uint16: 1, Uint32: 1, Uint64: 1, Int8: 1, Int16: 1, Int32: 1, Int64: 1, Int: 1, Float32: 1, Float64: 1, Byte: 1, Rune: 1, Uintptr: 1, String: "1", StringPointer: ToStringPointer(""), Array: [10]int{1}, Slice: []int{1}, Map: map[int]string{1: "1"}, Interface: "1", Error: errors.New("error"), } jsonData4, err := json.Marshal(testOmitEmptyWithNotDefaultValueButFatherSet) if err != nil { println(err) panic(err) } fmt.Printf("testOmitEmptyWithNotDefaultValueButFatherSet: %s\n", jsonData4) }
TestNotOmitEmpty
全部序列化成功。
TestOmitEmptyWithDefaultValue
默認值全軍覆沒,除了數組。
testOmitEmptyWithDefaultValueButFatherSet
自己設置的默認值也全軍覆沒,除了數組。
testOmitEmptyWithNotDefaultValueButFatherSet
非默認值當然不會被省略了。
原文鏈接:https://juejin.cn/post/7115343247530164254
相關推薦
- 2022-10-15 C語言庫函數qsort的使用及模擬實現_C 語言
- 2023-02-10 Docker?跨主機容器間相互訪問的實現_docker
- 2022-07-09 python?協程并發數控制_python
- 2022-12-11 Flow如何解決背壓問題的方法詳解_Android
- 2022-03-15 在MacOS+Linux+Nginx中發布和部署Asp.Net?Core_自學過程
- 2023-07-22 macos設置環境變量path詳解
- 2022-02-25 Linux下安裝Hadoop集群詳細步驟_Linux
- 2023-04-29 Python腳本修改Maya?ASCII文件路徑方法實現_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支