对于json解析的一点小坑...
1) 返回字段数 等于 定义struct 数 见代码:
package main
import (
"encoding/json"
"fmt"
"strings"
)
type GetResponse struct {
Message string `json:message`
Success int `json:success`
Vild string `json:vild`
Core string `json:core`
}
func main() {
sss := `callback_1491381399454({"message": "success", "success": 1, "vild": "bc48a84c5b0175efb6a59b2036f76cd8", "core": "3"})`
k := strings.Index(sss, "{") // 找第一个‘{’的位置
l := strings.Index(sss, ")") // 找第一个‘)’的位置
if k == -1 || l == -1 { // 是否查找成功
return
}
sbss := sss[k:l]
fmt.Printf("sss = ")
fmt.Println(sss)
fmt.Printf("sbss = ")
fmt.Println(sbss)
var geres GetResponse
err := json.Unmarshal([]byte(sbss), &geres)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("geres = ")
fmt.Println(geres)
fmt.Printf("geres.Vild = %s", geres.Vild)
}
2)返回字段数 小于 定义struct 数 代码是这样的
结构体定义:
type GetResponse struct {
Message string `json:message`
Success int `json:success`
Vild string `json:vild`
}
要处理的json格式文本是这样的:
sss11 := `callback_1491381399454({"message": "success", "success": 1,
"vild": "bc48a84c5b0175efb6a59b2036f76cd8","core": "3"})`
这样要处理的文本 就多了字段core,运行截图是这样的:
这说明:当你接收的 json格式文本字段比定义的结构体字段多的时候,也可以解析成功,只是不能访问多出的字段(例如:core),你可以这样尝试:
fmt.Printf("geres.Core = %s", geres.Core) //这是错误的,结构体中没有,无法访问到
3)复杂的json格式,怎么解析,格式是这样子的
{"success":0,"sss":55554,"message":"forbidden","static_value":{
"sbb":"6",
"arr":[
"static.geetest.com/",
"dn-staticdown.qbox.me/"
]
}}
可以这样定义 解析json的struct:
type Static_value struct {
Sbb string `json:sbb`
Arr []string `json:arr`
}
type GetResponseTest struct {
Message string `json:message`
Sss int `json:sss`
Success int `json:success`
Static_value Static_value `json:static_value`
}
这样也可以正常的解析出来,是这个效果的:
这样就可以解析出来了
注意,struct 的字段必须是 首字母大写,不然无法导出