Marshalling and Unmarshalling with Multiple JSON Tags
When unmarshalling JSON data into a struct, each field must have a corresponding JSON tag to specify its corresponding JSON key. However, sometimes you may need to create a new JSON file with the same data but different JSON tags.
In your case, you wish to unmarshal the JSON {"name":"Sam","age":20} to the struct Foo, and then create a modified version with the tags employee_name and - to send to another server.
While it would be convenient to assign multiple JSON tags to a single field as you proposed, this is not supported within the encoding/json package in Go. Instead, you can achieve the desired result by utilizing unexported types and casting.
package main import ( "bytes" "encoding/json" ) type Foo struct { Name string `json:"name"` Age int `json:"age"` } func main() { data := []byte(`{"name":"Sam","age":20}`) // Unmarshal to Foo var foo Foo json.Unmarshal(data, &foo) // Create a new type with modified tags type Bar struct { Name string `json:"employee_name"` Age int `json:"-"` } // Cast from Foo to Bar bar := Bar(foo) // Marshal Bar buf := new(bytes.Buffer) json.NewEncoder(buf).Encode(bar) println(buf.String()) }
Note: This approach relies on the unexported type Bar. Using unexported types helps prevent accidental usage elsewhere in the codebase. Additionally, ensure that the field names, types, and ordering in both structs match exactly for the casting to work correctly.
The above is the detailed content of How Can I Unmarshal JSON with One Set of Tags and Marshal with Another in Go?. For more information, please follow other related articles on the PHP Chinese website!