为了账号安全,请及时绑定邮箱和手机立即绑定

动态 JSON 解码

动态 JSON 解码

Go
蛊毒传说 2022-05-05 17:54:22
我有这个函数来解析 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, errcase "[]Dog":    var data []Dog    err = json.Unmarshal(content, &data)    if err != nil {        return nil, err    }    return data, errdefault:    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 []Stufferr = json.Unmarshal(content, &data)if err != nil {    return nil, err}return data, err每次我添加一个对象?通常我会使用泛型,但这是 Go。这样做的好方法是什么?
查看完整描述

2 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

您正在传递结构的名称,然后期待该类型的数据。相反,您可以简单地传递结构:


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)


查看完整回答
反对 回复 2022-05-05
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

在这里找到了我要找的东西。此功能完成工作:


func (a *Admin) ResponseDecode(body io.Reader, value interface{}) (interface{}, error) {

content, err := ioutil.ReadAll(body)


if err != nil {

    return nil, err

}


err = json.Unmarshal(content, &value)


if err != nil {

    return nil, err

}


return value, nil}


查看完整回答
反对 回复 2022-05-05
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信