我正在尝试解码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[]
我的代码有错吗?
最佳答案
您需要实现 UnmarshalText
而不是 UnmarshalJSON
。从documentation:
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
关于json - 解封JSON映射,其中 key 是非内置类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54261544/