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

golang json.Unmarshal 到 struct []byte

golang json.Unmarshal 到 struct []byte

Go
烙印99 2022-06-13 10:16:03
type TTT struct {    Info []byte    Version int32}func main(){    info:=`{"info":"0x97e302078c11ca8e7d75e2eedd1091eafec353864212085406d8d7dca0e3fa4a","version":20}`    test:=TTT{}    err:=json.Unmarshal([]byte(info),&test)    if err != nil {        fmt.Println("Error in JSON unmarshalling from json marshalled object:", err)        return    }    fmt.Println((test))}错误:从 json 编组对象中解组 JSON 时出错:输入字节 64 处的 base64 数据非法
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

您可能需要对十六进制数据进行编码:


package main


import (

        "encoding/base64"

        "encoding/json"

        "fmt"

)


type TTT struct {

        Info    []byte

        Version int32

}


func main() {

        b64Content := base64.StdEncoding.EncodeToString([]byte("0x97e302078c11ca8e7d75e2eedd1091eafec353864212085406d8d7dca0e3fa4a"))

        info := fmt.Sprintf(`{"info":"%s","version":20}`, b64Content)

        test := TTT{}

        err := json.Unmarshal([]byte(info), &test)

        if err != nil {

                fmt.Println("Error in JSON unmarshalling from json marshalled object:", err)

                return

        }

        fmt.Printf("%s", test.Info)

}


查看完整回答
反对 回复 2022-06-13
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

默认的 json 解析器将从 base64 字符串解析 []byte。


如果您的源字符串不是 base64,那么您需要定义自己的封送拆收器。


type TTT struct {

    Info    bytes

    Version int32

}


type bytes []byte


func (b *bytes) MarshalJSON() ([]byte, error) {

    str := string(input)

    bs, err :=hex.DecodeString(str[3:len(str)-1])

    if err!=nil{

        return err

    }

    *b = bs

    return nil

}


func (b *bytes) UnmarshalJSON(input []byte) error {

    *b = bytes(input)

    return nil

}


func main() {

    info := `{"info":"0x97e302078c11ca8e7d75e2eedd1091eafec353864212085406d8d7dca0e3fa4a","version":20}`

    test := TTT{}

    err := json.Unmarshal([]byte(info), &test)

    if err != nil {

        fmt.Println("Error in JSON unmarshalling from json marshalled object:", err)

        return

    }

    fmt.Println((test))

}


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 272 浏览
慕课专栏
更多

添加回答

举报

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