Golang的Jsonencodedecode以及[]byte和string的转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Golang的Jsonencodedecode以及[]byte和string的转换
使⽤了太长时间的python,对于强类型的Golang适应起来稍微有点费⼒,不过操作⼀次之后发
现,只有这么严格的类型规定,才能让数据尽量减少在传输和解析过程中的错误。

我尝试使⽤
Golang创建了⼀个公司的OpenAPI的demo,记录⼀下中间遇到的问题。

编码(Encode)Json:
⾸先来看下如何将字典编码成Json:
// ⾸先使⽤字⾯量来申明和初始化⼀个字典
param := map[string]int{"page_no": 1, "page_size": 40}
paramJson, err := json.Marshal(param)
使⽤json.Marshal接收需要json.encode的变量。

⽽json.Marshal接收的是interface{}接⼝变量,
该接⼝变量可以接收任何类型的数据。

[]byte转String以及String转[]byte:
通常我在python⾥⾯使⽤json.dumps来对字典进⾏序列化的时候,我通常认为出来的值是⼀个
string,可以将其作为string进⾏操作。

但是这⾥很明显返回的不是字符串(string)类型,⽽是⼀
个[]byte类型。

所以如果有需要,我们可以将[]byte类型,转换回string进⾏操作。

这⾥有⼏种⽅
法可供选择:
直接使⽤:
string([]byte)
或使⽤:
String([]byte[:])
ps:现在这两个得到的结果会是⼀样的,我现在使⽤的版本是1.8。

1.8以前好像会是不同的表
现。

同时我们也会遇到想要将string转换回[]byte的时候。

⽅法如下:
[]byte(string)
Http包的post请求来实践对Json的序列化反序列化:
当我们把json编码好之后我们需要将信息传递给服务器。

所以⽤到了http包。

在使⽤了之后我觉得go的http包真的⾮常⽅便,的确如传⾔中描述的强⼤和⼈性化,⽅便实⽤。

resp , err := http.PostForm(requestUrl, url.Values{"api_key": {ApiKey}, "api_sign": {apiSign},
"param": {string(param)}, "time": {now_time}, "version": {version}})
这⾥我使⽤http.PostForm⽅法使⽤带参数传递的post⽅法请求服务器。

url.Values后⾯可以跟
key[string][]string的形式传递参数。

返回⼀个http.response结构体指针和⼀个error类型。

http.response具体带有哪些属性可以详细查看⼀下包,这⾥我们会去解析他的Body字段,⾥⾯
存储着返回的内容:
// The Body is automatically dechunked if the server replied
// with a "chunked" Transfer-Encoding.
Body io.ReadCloser
这⾥Body是⼀个有io.ReadCloser接⼝的值。

io.ReadCloser接⼝实现了Read()和Write()⽅法。

我会⽤json的Decoder去解析它:
var response openApiResponse
resp := request.RequestHeader(paramJson, version, SyncUrl)
err1 := json.NewDecoder(resp.Body).Decode(&response)
if err1 != nil {
log.Println(err1)
}
return resp
这⾥json.NewDecoder接收⼀个有Reader⽅法的变量,之后我们调⽤了Decoder的⽅法decode 将⾥⾯的内容都存⼊事先申请好的response结构体变量中。

这个变量初始化了我们通过⽂档了解到的返回的结构体字段类型。

openApiResponse struct {
Success bool `json:"success"`
ResultCode int `json:"result_code"`
ResultMsg string `json:"result_msg"`
// 接收JSON字段
Result GoodsSyncResult `json:"result"`
}
这样⼀级⼀级解析下去,在构造接收返回回来数据的结构体的时候,注意到后⾯的json字段。

他是⼀个tag,可以在解析json的时候将对应名字的tag解析到对应的变量中。

这样就相当于你做好了数据结构,然后将对应的数据放到对应的字段⾥⾯去。

当然还有⼀种办法,当你不知道你所接收数据的数据结构的时候,你是没有办法提前申明好这些数据结构然后来接收的。

这时我们可以申明⼀个空接⼝interface{},让空接⼝的指针来接收这组数据,可以查看这组数据的数据结构。

var hahaha interface{}
resp := request.RequestHeader(paramJson, version, SyncUrl)
err1 := json.NewDecoder(resp.Body).Decode(&hahaha)
if err1 != nil {
log.Println(err1)
}
上⾯的hahaha可以接收并decodejson,来接收这组数据。

并且可以直接使⽤fmt.Print之类函数直接打印接收到的数据。

如果想直接使⽤,我们可以使⽤类型断⾔但是更推荐的⽅法是,我们可以根据这组数据来写对应的结构体,然后将数据接收到结构体上进⾏操作。

就像上⾯⼀样。

同样的我们还可以使⽤⼀个map[string]interface{}来接收这个Json以⽅便对其进⾏后续操作,避免不需要的多余的反射。

var hahaha map[string]interface{}
resp := request.RequestHeader(paramJson, version, SyncUrl)
err1 := json.NewDecoder(resp.Body).Decode(&hahaha)
return hahaha
除了实现⼀个decoder来处理数据,我们往往有Json序列化之后就⽴即需要序列化的操作,这个同样很容易使⽤:
json.Unmarshal([]byte, &xx)
来处理就好了。

参数⼀是需要decode的Json数据, 参数⼆是⽤于接收这组数据的结构体字段。

同样的我们也可以使⽤⼀个空接⼝来接收数据,也可以使⽤⼀⼀对应的结构体来放置数据。

看了上⾯的⼀堆介绍有⼀个感觉,就处理Json数据和类型转换来说。

python真是简单到爆炸,⼀个dumps⼀个loads轻松搞定。

但是Golang严格的参数类型缺可以保证解析过来的数据⼀
定是对应的数据结构和数据类型。

不会在类型上报错更为严谨。

个⼈觉得这很有趣,也很喜欢。

Reference:
/questions/3371714/go-string-to-ascii-byte-array go-string-to-ascii-byte-array
/questions/24377907/golang-issue-with-accessing-nested-json-array-after-unmarshalling golang-issue-with-accessing-nested-json-array-after-unmarshalling /tiaotiaoyly/article/details/38942311 在Go语⾔中使⽤JSON。

相关文档
最新文档