golang json.Unmarshal到struct[]字节

golang json.Unmarshal到struct[]字节,go,Go,错误:从JSON封送对象进行JSON解组时出错:输入字节64处的base64数据非法您可能需要对十六进制数据进行编码: type TTT struct { Info []byte Version int32 } func main(){ info:=`{"info":"0x97e302078c11ca8e7d75e2eedd1091eafec353864212085406d8d7dca0e3fa4a","version":20}` test:=TTT{}

错误:从JSON封送对象进行JSON解组时出错:输入字节64处的base64数据非法

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

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解析器将解析base64字符串中的[]字节

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

类型TTT结构{
信息字节
int32版本
}
类型bytes[]字节
func(b*字节)MarshalJSON()([]字节,错误){
str:=字符串(输入)
bs,err:=hex.DecodeString(str[3:len(str)-1])
如果错误!=零{
返回错误
}
*b=bs
归零
}
func(b*字节)解组JSON(输入[]字节)错误{
*b=字节(输入)
归零
}
func main(){
信息:=`{“信息”:“0x97e302078c11ca8e7d75e2eedd1091eafec353864212085406d8d7dca0e3fa4a”,“版本:20}`
测试:=TTT{}
err:=json.Unmarshal([]字节(信息),&test)
如果错误!=零{
Println(“JSON解组JSON封送对象时出错:”,err)
返回
}
fmt.Println((测试))
}

encoding/json通过将json字符串解释为base64将json字符串解组为[]字节,并且您不能更改此设置(除非您编写自己的类型并实现自己的封送拆收器)。所以:解组成字符串。请阅读整个包文档,详细说明。使用自定义类型和自定义封送处理程序
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)
}