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

无法在 go 中使用 base64 编码的字节片解组 json

无法在 go 中使用 base64 编码的字节片解组 json

Go
DIEA 2022-11-23 20:27:08
我很难解组从 AWS lambda 函数发送给我的结构。pkidata无论我做什么,所有字段都是空的。我创建了这个代码示例来隔离这个过程:package mainimport (    "encoding/base64"    "encoding/json"    "fmt")func main() {// yeah the string is long lol     var body ResponseBody    if err := json.Unmarshal([]byte(mystring), &body); err != nil {        fmt.Println(fmt.Errorf("failed unmarshaling response | %s", err.Error()))    }    fmt.Println(body.Error.ErrorMessage)    certChain, err := base64.StdEncoding.DecodeString(mystring)    if err != nil {        fmt.Println(err.Error())    }    fmt.Println(certChain)}type PkiGenerationInput struct {    TeacherUsername string `json:"teacherusername"`}type Response struct {    Headers ResponseHeaders `json:"headers"`    Body    ResponseBody    `json:"body"`}type ResponseHeaders struct {    ContentType string `json:"Content-Type"`}type ResponseBody struct {    PkiData ParsablePkiData `json:"pkidata"`    Error   struct {        ErrorMessage string `json:"errormessage"`        ErrorType    string `json:"errortype"`    } `json:"error"`}type ParsablePkiData struct {    Certificate      string `json:"certificate"`    PrivateKey       string `json:"privatekey"`    CertificateChain string `json:"certificatechain"`}这是输出errormessagetestillegal base64 data at input byte 0[]事实上,我可以阅读errormessagetest节目,解组有点管用,所以这很奇怪。我检查了任何未导出的字段,但我们可以清楚地看到它们都是大写的。我还“只是为了看看”减小了字符串大小,但它没有改变任何东西。
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

综合所有评论的答案:


首先,我的“愚蠢错误”是因为我试图解码错误的变量:


// mystring needs to be replaced by body.PkiData.Certificate

base64.StdEncoding.DecodeString(mystring) 

但研究让我们发现,json.Unmarshal()当结果类型与声明的类型匹配时,该函数会自行解码 base64。鉴于编码数据是 a ,我只是在结构中用 a[]byte替换了string类型。[]byte


这允许创建以前代码的更简单版本:


type ResponseBody struct {

    PkiData PkiData `json:"pkidata"`

}


type PkiData struct {

    Certificate      []byte

    PrivateKey       []byte

    CertificateChain []byte

}


var body ResponseBody

if err := json.Unmarshal(rawResp.Payload, &body); err != nil {

    return PkiData{}, fmt.Errorf("failed unmarshaling response | %s", err.Error())

}


查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

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