- 将现有练习及 module 文件迁移至 go/practice,保持代码和依赖不变 - 新增 go/projects 项目区说明,更新目录约定与开发命令 BREAKING CHANGE: Go 练习命令需改在 go/practice 目录下执行
69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
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)
|
|
}
|