我的问题是:
在代码中name := base58.Decode(group.Name)增加这一行,json_iterator.Marshal(group)这个函数就运行下去了,但是 json.Marshal(group)是可以的,是为什么,我的程序中就碰到了类似这样的事情,其中并没有对请求过来的数据进行过编解码的操作,可是打印出来的数据变成了乱码类似这样“\ufffd\ufffd\ufffd”的,然后进行json序列化时程序就会卡住,想知道这是什么原因还有解决办法是什么?
package main
import (
"encoding/json"
"fmt"
"os"
"github.com/btcsuite/btcutil/base58"
"github.com/json-iterator/go"
)
func main() {
type ColorGroup struct {
ID int
Name string
Colors []string
}
group := ColorGroup{
ID: 1,
Name: "AB2SSDF",
Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}
name := base58.Decode(group.Name) //这里进行一个base58解码后,Name字段就会变成乱码,如果name字符串中含有数字,json_iterator.Marshal函数就进行不下去了,想问一下这是什么原因,要怎么解决
fmt.Println("name",string(name))
group.Name = string(name)
b, err := json.Marshal(group)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(b)
fmt.Println("\n")
var json_iterator = jsoniter.ConfigCompatibleWithStandardLibrary
b, err = json_iterator.Marshal(group)
os.Stdout.Write(b)
fmt.Println("\n")
}
更多评论
你原来的字符串本身就不是base58编码的,你硬要base58解码,你说会不会乱码?
group.Name = base58.Encode([]byte("xxxxxxxx"))
这样测试一下就对了
#1
`Name: "AB2SSDF",` 这里假定"AB2SSDF"是base58编码后的内容,base64这类编码的目的就是把不可打印的二进制数据转换为可打印的常用字符,也就是将二进制数据转换成文本,方便类似json这样的文本格式传输二进制数据
`name := base58.Decode(group.Name)`你这里decode出来的是要用的有意义的二进制数据
`group.Name = string(name)` ,将二进制数据强转为不可打印的字符串然后marshal肯定会失败,也没必要这么做,要做就先将二进制数组base64或base58转换为常用字符表示的字符串,再设置到name
#3