首页 > 解决方案 > 有没有办法通过转换类型在 Go 中解码 JSON?

问题描述

我正在使用一个 API,如果它为零,它可以返回一个值作为 int,如果它不为零,则返回一个字符串,我想要一个解码器,它将这两个 JSON 正确解码为结构

{
  "id": 1,
  "rating": 0
}
{
  "id": 2,
  "rating": "2"
}
type User struct {
  Id int64 `json:"id"`
  Rating int64 `json:"rating,string"`
}

所以它应该尝试将任何 JSON 类型(int、float、string)转换为 struct 中指定的类型,并且只有在不可能的情况下才会引发错误。标准 json.Decoder 不这样做。

或者也许有一些更可定制的 json 解析库?

标签: jsonparsinggo

解决方案


您正在尝试int64从 JSON 字符串中解析一个。您可以使用实现 JSON Unmarshaler 接口的自定义类型来执行此操作。

例如

type User struct {
    Id     int64       `json:"id"`
    Rating Int64String `json:"rating"`
}

type Int64String int64

func (i Int64String) MarshalJSON() ([]byte, error) {
    return json.Marshal(strconv.FormatInt(int64(i), 10))
}

func (i *Int64String) UnmarshalJSON(data []byte) error {
    var jstring string
    err := json.Unmarshal(data, &jstring)
    if err != nil {
        return err
    }
    *(*int64)(i), err = strconv.ParseInt(jstring, 0, 64)
    return err
}

操场


推荐阅读