【问题标题】:Dynamic JSON Decoding动态 JSON 解码
【发布时间】:2020-05-04 20:47: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, 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。这样做的好方法是什么?

【问题讨论】:

    标签: go


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 需要注意的是,使用最后一种方法,有人可能会发送一个非常大的请求体来导致服务器崩溃。您可以使用http.MaxBytesReader 设置一个合理的最大值来保护自己免受它的影响
    【解决方案2】:

    找到我要找的东西here。 这个函数可以完成工作:

    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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      相关资源
      最近更新 更多