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

Go Struct解码博览会推送通知响应?

Go Struct解码博览会推送通知响应?

Go
精慕HU 2022-11-23 19:59:14

我正在做一项服务,向 Expo 后端发送推送通知。一旦 http 调用 Expo 以波纹管格式响应(根据 Expo):


{

  "data": [

    {

      "status": "error" | "ok",

      "id": string, // this is the Receipt ID

      // if status === "error"

      "message": string,

      "details": JSON

    },

    ...

  ],

  // only populated if there was an error with the entire request

  "errors": [{

    "code": number,

    "message": string

  }]

}

这是一个提供的响应示例:


{

  "data": [

    {

      "status": "error",

      "message": "\\\"ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]\\\" is not a registered push notification recipient",

      "details": {

        "error": "DeviceNotRegistered"

      }

    },

    {

      "status": "ok",

      "id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"

    }

  ]

}

我创建了结构来解码响应。现在我尝试解码“详细信息”字段的响应时出错,无论我在我的结构中使用什么类型。我如何处理将 expo 标记为“JSON”的字段?


import (

    uuid "github.com/satori/go.uuid"

)



type PushResult struct {

    Errors []ErrorDetails `json:"errors,omitempty"`

    Datas   []DataPart     `json:"data,omitempty"`

}

type ErrorDetails struct {

    Code    int32  `json:"code,omitempty"`

    Message string `json:"message,omitempty"`

}

type DataPart struct {

    Status  string    `json:"status,omitempty"`

    ID      uuid.UUID `json:"id,omitempty"`

    Message string    `json:"message,omitempty"`

    Details string `json:"details,omitempty"` //also tried map[string]string and interface{}


}

这是我正在使用的结构。我也通过查看示例进行了尝试:


type DataPart struct {

    Status  string    `json:"status,omitempty"`

    ID      uuid.UUID `json:"id,omitempty"`

    Message string    `json:"message,omitempty"`

    Details struct{

           Error string `json:"error"`} `json:"details,omitempty"` 


}

但每次都会收到类似“json:无法将对象解组到 Go struct 字段 DataPart.data.details”之类的错误


查看完整描述

1 回答

?
繁华开满天机

TA贡献1526条经验 获得超1个赞

我刚刚使用您的响应示例创建了您的结构,它工作得很好。

操场

也就是说,如果您想要一种更好的调试“解组错误”的方法,您可以解包它。这样您就可以打印其他数据。

var t *json.UnmarshalTypeError
if errors.As(err, &t) {
    spew.Dump(t)
}

示例-> 我将错误类型更改为整数,这样我就可以伪造错误。

OBS:请注意,您的“数据”是一个数组,只有第一个有错误。


查看完整回答
反对 回复 2022-11-23

添加回答

举报

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