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

我很难解组从 AWS lambda 函数发送给我的结构。


pkidata无论我做什么,所有字段都是空的。我创建了这个代码示例来隔离这个过程:


package main


import (

    "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"`

}


这是输出


errormessagetest

illegal base64 data at input byte 0

[]

事实上,我可以阅读errormessagetest节目,解组有点管用,所以这很奇怪。


我检查了任何未导出的字段,但我们可以清楚地看到它们都是大写的。我还“只是为了看看”减小了字符串大小,但它没有改变任何东西。


DIEA
浏览 136回答 1
1回答

RISEBY

综合所有评论的答案:首先,我的“愚蠢错误”是因为我试图解码错误的变量:// mystring needs to be replaced by body.PkiData.Certificatebase64.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 ResponseBodyif err := json.Unmarshal(rawResp.Payload, &body); err != nil {    return PkiData{}, fmt.Errorf("failed unmarshaling response | %s", err.Error())}
打开App,查看更多内容
随时随地看视频慕课网APP