package main import ( "fmt" "testing" "time" // 引入两个包进行对比 jsonV1 "encoding/json" jsonV2 "encoding/json/v2" ) func TestV2Null(t *testing.T) { type Product struct { Name string `json:"name"` Tags []string `json:"tags"` } p := Product{ Name: "product1", } data1, _ := jsonV1.Marshal(p) data2, _ := jsonV2.Marshal(p) t.Log(string(data1)) t.Log(string(data2)) } func TestOmitZeroVsEmpty(t *testing.T) { // ===== V1 结构体:使用 omitempty ===== type EventV1 struct { Title string `json:"title"` CreatedAt time.Time `json:"created_at,omitempty"` // ⚠️ omitempty 对 time.Time 无效 } // ===== V2 结构体:使用 omitzero ===== type EventV2 struct { Title string `json:"title"` CreatedAt time.Time `json:"created_at,omitzero"` // ✅ omitzero 能识别 IsZero() } // 都不给 CreatedAt 赋值,保持 Go 的零值 time.Time{} // 1. 测试 v1 + omitempty e1 := EventV1{Title: "Go Meetup"} data1, _ := jsonV1.Marshal(e1) fmt.Println("v1 + omitempty 输出:", string(data1)) // 2. 测试 v2 + omitzero e2 := EventV2{Title: "Go Meetup"} data2, _ := jsonV2.Marshal(e2) fmt.Println("v2 + omitzero 输出:", string(data2)) } func TestMultiStyle(t *testing.T) { type MultiStyleUser struct { // 1. 严格匹配:JSON key 必须精确是 "user_id" ID string `json:"user_id,case:strict"` // 2. 忽略大小写:JSON key 是 "Name"、"NAME"、"name" 都能成功赋值 Name string `json:"name,case:ignore"` } // 假设第三方传来的 JSON 风格混杂 jsonData := []byte(`{ "user_id": "1001", "NAME": "Gopher" }`) var m MultiStyleUser jsonV2.Unmarshal(jsonData, &m) t.Log(m) }