为了账号安全,请及时绑定邮箱和手机立即绑定

解组可能返回或不返回数组的 JSON?

解组可能返回或不返回数组的 JSON?

Go
桃花长相依 2021-11-01 17:26:24
我正在从第三方网站(家庭用电量)检索 JSON,并且根据我从该网站请求的内容,返回的 JSON 可能是也可能不是数组。例如,如果我请求我的智能电表列表,我会得到这个(结果被截断,因为尺寸很大):{"gwrcmds":{"gwrcmd":{"gcmd":"SPA_UserGetSmartMeterList","gdata":{"gip":{"version":"1"...其中gwrcmd是单个元素。但是如果我要求在过去半小时内用电,我会得到这个:{"gwrcmds":{"gwrcmd":[{"gcmd":"DeviceGetChart","gdata":{"gip":{"version":"1" ...看看gwrcmd现在如何成为一个数组?在我的 Go 应用程序中,我有一个看起来像这样的结构(再次被截断,因为它持续了一段时间。在“版本”下面有更多的子结构和属性:type Response struct {     Gwrcmds struct {         Gwrcmd struct {             Gcmd  string             Gdata struct {                 Gip struct {                     Version string如果gwrcmd是一个数组,Gwrcmd需要是一个[]struct { },但如果不是,它只是一个普通的旧struct { }问题是,json.Unmarshal如果 JSON 有一个数组而结构没有切片(反之亦然),则只会返回错误。我是否需要创建第二个结构体来复制第一个结构体(除了用 a[]struct { }代替),还是有更好的方法来做到这一点?我想到了一些接口,但我还没有真正接触过那些,所以我不能 100% 确定它们。
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

您可以尝试使自定义 json 解组方法,例如


func (a *GwrcmCustom) UnmarshalJSON(b []byte) (err error) {

    g, ga := Gwrcmd{}, []Gwrcmd{}

    if err = json.Unmarshal(b, &g); err == nil {

        *a = make([]Gwrcmd, 1)

        []Gwrcmd(*a)[0] = Gwrcmd(g)

        return

    }

    if err = json.Unmarshal(b, &ga); err == nil {

        *a = GwrcmCustom(ga)

        return

    }

    return

}

GwrcmCustom 是自定义类型,切片 Gwrcm


type GwrcmCustom []Gwrcmd

所以我们总是会得到切片


试试这个 Go playground


我希望这个能帮上忙


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信