动态 JSON 解码

我有这个函数来解析 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。这样做的好方法是什么?


蛊毒传说
浏览 99回答 2
2回答

神不在的星期二

您正在传递结构的名称,然后期待该类型的数据。相反,您可以简单地传递结构:var parsed []Caterr := 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 []Caterr:=json.NewDecoder(body).Decode(&parsed)

慕田峪7331174

在这里找到了我要找的东西。此功能完成工作: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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go