如何使golang中的unmarshall函数处理多种类型?

时间:2019-07-15 22:33:39

标签: go types polymorphism

我在golang中使用json.unmarshalling函数来解码从API获得的一些JSON响应。如何使其处理多种类型?

我们收到的响应始终是状态码和消息,但是json字段具有不同的名称。有时这两个字段称为代码和消息,有时又称为状态代码和描述,具体取决于我们查询的内容。

说我们查询Apple,这可以通过创建如下的Apple类型结构来解决:

type Apple struct {
    Code        int    `json:"code"`
    Description string `json:"message"`
}

但是当我们查询Peach时,我们返回的json不再是代码和消息了,字段名称变为statuscode和description。因此,我们将需要以下内容:

type Peach struct {
    Code        int    `json:"statuscode"`
    Description string `json:"description"`
}

潜在地,我们需要设置50种以上的类型并重复50次?必须有更好的方法来做到这一点。不幸的是,我是Golang的新手,也不知道多态在这种语言中是如何工作的。请帮忙。

1 个答案:

答案 0 :(得分:0)

据我所知,您应该始终解码为结构,以受益于go静态类型,该结构所附带的方法,并且也许能够使用{{3 }},但是您总是可以将JSON主体解析成这样的映射:

// JsonParse parses the json body of http request
func JsonParse(r *http.Request) (map[string]interface{}, error) {
    // Read the r.body into a byte array
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        return nil, err
    }
    // Make a map of String keys and Interface Values
    b := make(map[string]interface{})
    // Unmarshal the body array into the map
    err = json.Unmarshal(body, &b)
    if err != nil {
        return nil, err
    }
    return b, nil
}