json - 有没有一种方法可以通过转换类型在 Go 中解码 JSON?

标签 json parsing go

我正在使用一个 API,如果它为零,它可以返回一个值,如果它不为零,则返回一个字符串,我想要一个解码器,它将这两个 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解析库?

最佳答案

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

例如

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
}

Playground

关于json - 有没有一种方法可以通过转换类型在 Go 中解码 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53682521/

相关文章:

go - 检查 Go 中已安装的包

docker - 使用 Docker 容器中的 go 1.10 构建缓存加速 Go 构建

javascript - 检索子级对象的属性

java - 系统目录到java列表

c++ - 从 DXF 文件中解析不完整的椭圆

javascript - 在 Atom 包中获取整个树守护者解析树

error-handling - Go 中如何指定和处理特定的错误?

sql - 在 SQL Server 中从 JSON 中的数组获取值

c - 使用 JSON 数据

java - ww SimpleDateFormat 的奇怪行为