登录
首页 >  Golang >  Go问答

Go 结构字段.result.case_report中的字符串无法解组到main.CaseReport类型

来源:stackoverflow

时间:2024-02-27 14:15:26 166浏览 收藏

你在学习Golang相关的知识吗?本文《Go 结构字段.result.case_report中的字符串无法解组到main.CaseReport类型》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!

问题内容

我需要解组一个 api 响应,该响应并不总是包含主结构内定义的某些结构的值。主要结构如下所示:

type caseresponse struct {
    result struct {
        grouplist               string `json:"group_list"`
        ucopiedfrom             string `json:"u_copied_from"`
        uoffervariant           string `json:"u_offer_variant"`
        syncdriver              string `json:"sync_driver"`
        primarycontact          *primarycontact `json:"primary_contact,omitempty"`
        entitlement             string          `json:"entitlement"`
        casereport              *casereport     `json:"case_report,omitempty"`
        resolvedat              string          `json:"resolved_at"`
    } `json:"result"`
}

上述 json 的内部结构定义为:

type primarycontact struct {
    link  string `json:"link,omitempty"`
    value string `json:"value,omitempty"`
}
type casereport struct {
    link  string `json:"link,omitempty"`
    value string `json:"value,omitempty"`
}

primarycontact 和 casereport 返回空是很常见的,当它们这样做时,go 会抛出错误:json 无法将字符串解组到 go struct .result.case_report of type main.casereport

我寻找可能的修复方法。首先,我将“,omitempty”添加到内部结构的值中,但没有解决问题。然后添加了 primarycontact 和 casereport 的指针,如在其他一些帖子中找到的那样,但是当响应返回那些没有数据的字段时,我仍然遇到相同的错误,例如:

{
  "result": {
    "group_list": "",
    "u_copied_from": "",
    "u_offer_variant": "",
    "sync_driver": "false",
    "primary_contact":"",
    "entitlement": "",
    "case_report": "",
    "resolved_at": ""
}

但是当primary_contact和case_report值返回时工作正常:

{
  "result": {
    "group_list": "",
    "u_copied_from": "",
    "u_offer_variant": "",
    "sync_driver": "false",
    "primary_contact": {
      "link": "some link",
      "value": "1e717ed013897b00f2345aa12244b003"
    },
    "entitlement": "",
    "case_report": {
      "link": "some link",
      "value": "2b10fa5e1b1b19d45836ea89bd4bcb35"
    },
    "resolved_at": ""
}

当这些字段没有返回值时,如何安全地解组响应?


正确答案


primarycontactcasereport 上实现解组器接口。当值为空字符串时不执行任何操作。

func (pc *PrimaryContact) UnmarshalJSON(p []byte) error {
    if string(p) == `""` {
        // empty string, do nothing
        return nil
    }
    // Prevent recursion to this method by declaring a new
    // type with same underlying type as PrimaryContact and
    // no methods. 
    type x PrimaryContact
    return json.Unmarshal(p, (*x)(pc))
}

https://go.dev/play/p/uhjobdw5rr2

go 抛出错误...

encoding/json 包函数返回错误。 go 没有 throw 功能。

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

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