我正在尝试解组JSON映射,其中的键是非内置类型。我该如何实现?
我写了一些示例代码来说明我认为的外观。 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)
}
但是,我不断遇到此错误:
Error: json: cannot unmarshal number TIER1 into Go value of type main.TierUnmarshaled data: map[]
我的代码有错吗?
答案 0 :(得分:3)
您需要实现UnmarshalText
而不是UnmarshalJSON
。来自documentation:
地图值编码为JSON对象。地图的键类型必须是字符串,整数类型或实现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
}