代码之家  ›  专栏  ›  技术社区  ›  switch

动态JSON解码

go
  •  0
  • switch  · 技术社区  · 6 年前

    我有一个解析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
    

    每次我添加一个对象?通常我会使用泛型,但这是去。有什么好办法?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Burak Serdar    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)
    
        2
  •  0
  •   Elizabeth    6 年前
        3
  •  0
  •   switch    6 年前

    找到了我要找的东西 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}