登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-31 21:33:34 274浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《如何使 golang 中的 unmarshall 函数处理多种类型?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

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

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

假设我们查询 apple,这可以通过创建一个 apple 类型结构来简单地解决,如下所示:

type apple struct {
    code        int    `json:"code"`
    description string `json:"message"`
}

但是当我们查询peach时,我们返回的json不再是code和message,字段名称变成了statuscode和description。所以我们需要以下内容:

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

我们可能需要再设置 50 个类型并重复写入 50 次?必须有更好的方法来做到这一点。不幸的是,我是 golang 新手,不知道多态性在这种语言中是如何工作的。请帮忙。


解决方案


据我所知,您应该始终解码为结构,以便从 go static types 和附加到该结构的方法中受益,并且也许能够使用像 validator 这样的包来验证您的响应,但是您始终可以将 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
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>