go - 动态JSON解码

标签 go

我有此功能来解析HTTP结果:

func (a *Admin) ResponseDecode(structName string, body io.Reader) (interface{}, error) {
content, err := ioutil.ReadAll(body)

if err != nil {
    return nil, err
}

switch structName {
case "[]Cat":
    var data []Cat
    err = json.Unmarshal(content, &data)

    if err != nil {
        return nil, err
    }
    return data, err

case "[]Dog":
    var data []Dog
    err = json.Unmarshal(content, &data)

    if err != nil {
        return nil, err
    }
    return data, err
default:
    log.Fatal("Can't decode " + structName)
}

return nil, nil
}

我在此方法之后进行类型断言:
parsed, err := a.ResponseDecode("[]Cat", resp.Body)

if err != nil {
    return nil, err
}

return parsed.([]Cat), nil

但是我该如何避免代码的重复:
var data []Stuff
err = json.Unmarshal(content, &data)

if err != nil {
    return nil, err
}
return data, err

每次添加对象时?通常我会使用泛型,但这就是Go。这样做的好方法是什么?

最佳答案

您要传递结构的名称,然后再输入该类型的数据。相反,您可以简单地传递该结构:

var parsed []Cat
err := a.ResponseDecode(&parsed, resp.Body)

哪里:
func (a *Admin) ResponseDecode(out interface{}, body io.Reader)  error {
  content, err := ioutil.ReadAll(body)
   if err != nil {
      return nil, err  
   }
  return json.Unmarshal(content,out)
}

实际上,您可以摆脱ResponseDecode函数:
var parsed []Cat
err:=json.NewDecoder(body).Decode(&parsed)

关于go - 动态JSON解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59796242/

相关文章:

go - 函数中的秒操作

windows - Golang exec .bat 或 .exe 文件但没有得到输出

mongodb - 是否可以使用 mgo 驱动程序运行 mongo replicaset 命令?

api - 从 Golang REST API 生成 Amazon S3 token

go - 在整洁的架构设置中使用 gorm 时是否需要持久性模型?

arrays - Go 如何保证元素指针对数组和 slice 有效?

go - 我们如何在运行Kafka Confluent Golang中多个进程的应用程序上管理事务ID?

go - 在 go ( golang ) 中为 slice 结构赋值

go - 返回的参数太多

戈朗 : goroutine infinite-loop