Reputation: 22270
I'm trying to Unmarshal a JSON map, where the key is a non-builtin type. How do I achieve this?
I wrote some example code for what I think the code should look like. Go playground link
package main
import (
"encoding/json"
"errors"
"fmt"
)
type Tier int
func (t *Tier) UnmarshalJSON(data []byte) error {
switch string(data) {
case "TIER1":
*t = 1
case "TIER2":
*t = 2
default:
return errors.New("Unrecognized")
}
return nil
}
func main() {
jsonData := []byte(`{
"TIER1": "hello",
"TIER2": "world"
}`)
unmarshaledData := map[Tier]string{}
if err := json.Unmarshal(jsonData, &unmarshaledData); err != nil {
fmt.Print("Error: ", err)
}
fmt.Print("Unmarshaled data: ", unmarshaledData)
}
However, I keep on getting this error:
Error: json: cannot unmarshal number TIER1 into Go value of type main.TierUnmarshaled data: map[]
Am I doing anything wrong in my code?
Upvotes: 2
Views: 143
Reputation:
You need to implement UnmarshalText
instead of UnmarshalJSON
. From the documentation:
Map values encode as JSON objects. The map's key type must either be a string, an integer type, or implement encoding.TextMarshaler.
func (t *Tier) UnmarshalText(data []byte) error {
switch string(data) {
case "TIER1":
*t = 1
case "TIER2":
*t = 2
default:
return errors.New("Unrecognized")
}
return nil
}
https://play.golang.org/p/6omS7ImuvRl
Upvotes: 3