也可以在运行时使用
reflect
如果你需要的话。
func (m *My) MarshalJSON() ([]byte, error) {
oldtype := reflect.TypeOf(*m)
fields := make([]reflect.StructField, oldtype.NumField())
for i := 0; i < oldtype.NumField(); i++ {
field := oldtype.Field(i)
if _, ok := field.Tag.Lookup("xml"); ok {
field.Tag = reflect.StructTag(strings.Replace(string(field.Tag), "xml", "json", 1))
}
fields[i] = field
}
newtype := reflect.StructOf(fields)
a := reflect.ValueOf(*m).Convert(newtype).Interface()
return json.Marshal(&a)
}
Working example