如何在golang中对特殊的json字符串进行base64编码?

zan*_*ngw 1 base64 json go

我需要在golang中通过base64编码以下字符串

"{\n\t\"signature\" = \"ZwXG56AezlHRTBhL8cTqA==\";\n\t\"purchase-info\" = \"RXRjL0dNVCI7Cn0=\";\n\t\"environment\" = \"Sandbox\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}"

我尝试做到如下

rec = []byte("{\n\t\"signature\" = \"ZwXG56AezlHRTBhL8cTqA==\";\n\t\"purchase-info\" = \"RXRjL0dNVCI7Cn0=\";\n\t\"environment\" = \"Sandbox\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}")
str := base64.StdEncoding.EncodeToString(rec)
fmt.Println(str)
Run Code Online (Sandbox Code Playgroud)

输出量

ewoJInNpZ25hdHVyZSIgPSAiWndYRzU2QWV6bEhSVEJoTDhjVHFBPT0iOwoJInB1cmNoYXNlLWluZm8iID0gIlJYUmpMMGROVkNJN0NuMD0iOwoJImVudmlyb25tZW50IiA9ICJTYW5kYm94IjsKCSJwb2QiID0gIjEwMCI7Cgkic2lnbmluZy1zdGF0dXMiID0gIjAiOwp9

但是,它失败了。因为结果与通过https://www.base64encode.org/的base64结果不同,所以

e1xuXHRcInNpZ25hdHVyZVwiID0gXCJad1hHNTZBZXpsSFJUQmhMOGNUcUE9PVwiO1xuXHRcInB1cmNoYXNlLWluZm9cIiA9IFwiUlhSakwwZE5WQ0k3Q24wPVwiO1xuXHRcImVudmlyb25tZW50XCIgPSBcIlNhbmRib3hcIjtcblx0XCJwb2RcIiA9IFwiMTAwXCI7XG5cdFwic2lnbmluZy1zdGF0dXNcIiA9IFwiMFwiO1xufQ==

然后我以这种方式尝试

data1 := []byte(`{\n\t\"signature\" = \"ZwXG56AezlHRTBhL8cTqA==\";\n\t\"purchase-info\" = \"RXRjL0dNVCI7Cn0=\";\n\t\"environment\" = \"Sandbox\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}`)
str1 := base64.StdEncoding.EncodeToString(data1)
fmt.Println(str1)
Run Code Online (Sandbox Code Playgroud)

输出:

e1xuXHRcInNpZ25hdHVyZVwiID0gXCJad1hHNTZBZXpsSFJUQmhMOGNUcUE9PVwiO1xuXHRcInB1cmNoYXNlLWluZm9cIiA9IFwiUlhSakwwZE5WQ0k3Q24wPVwiO1xuXHRcImVudmlyb25tZW50XCIgPSBcIlNhbmRib3hcIjtcblx0XCJwb2RcIiA9IFwiMTAwXCI7XG5cdFwic2lnbmluZy1zdGF0dXNcIiA9IFwiMFwiO1xufQ==

现在结果是正确的。

如何转换原始字符串

[]byte("{\n\t\"signature\" = \"ZwXG56AezlHRTBhL8cTqA==\";\n\t\"purchase-info\" = \"RXRjL0dNVCI7Cn0=\";\n\t\"environment\" = \"Sandbox\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}")
Run Code Online (Sandbox Code Playgroud)

[]byte(`{\n\t\"signature\" = \"ZwXG56AezlHRTBhL8cTqA==\";\n\t\"purchase-info\" = \"RXRjL0dNVCI7Cn0=\";\n\t\"environment\" = \"Sandbox\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}`) 
Run Code Online (Sandbox Code Playgroud)

在高朗?还是有更好的方法呢?

Pet*_*ter 5

双引号和反引号表示Go中不同的字符串文字:https : //play.golang.org/p/wfIPUJtxT9n

特别是,反斜杠与反引号一起使用时不能转义;他们被保留。例如,len("\"") == 1(字节0x22),但len(`\"`) == 2(字节0x5C和0x22)。

这是在规范中定义

原始字符串文字是反引号之间的字符序列,如中所示foo。在引号内,除反引号外,任何字符都可能出现。原始字符串文字的值是由引号之间未解释(隐式为UTF-8编码)的字符组成的字符串。特别是,反斜杠没有特殊含义,并且字符串可能包含换行符。原始字符串文字中的回车符('\ r')从原始字符串值中丢弃。