2 回答
TA贡献1858条经验 获得超8个赞
仅当您使用反射即时重建结构时,您才能做到这一点。这里有一个包(我没试过)。
但我建议您为结构编写一个自定义 MarshalJSON 方法,该方法根据变量的类型处理案例。
package main
import (
"encoding/json"
"errors"
"fmt"
)
type Phone[T any] struct {
variableType T
Number string
}
func (p Phone[T]) MarshalJSON() ([]byte, error) {
switch any(p.variableType).(type) {
case Company:
return json.Marshal(&struct {
Number string `json:"company_phone_number"`
}{
Number: p.Number,
})
case Company2:
return json.Marshal(&struct {
Number string `json:"company2_phone_number"`
}{
Number: p.Number,
})
}
return []byte{}, errors.New("Invalid type")
}
type Company struct {
}
type Company2 struct {
}
func main() {
p := Phone[Company]{
Number: "123",
}
p2 := Phone[Company2]{
Number: "321",
}
data1, _ := json.Marshal(p)
data2, _ := json.Marshal(p2)
fmt.Println(p, string(data1))
fmt.Println(p2, string(data2))
}
如果你想避免开关,你可以获得变量类型,reflect.TypeOf(p.variableType).Name()但是你必须编写一个自定义 JSON 封送拆收器来表示带有自定义 json 标记的字节切片。
- 2 回答
- 0 关注
- 88 浏览
添加回答
举报