场景是用 go 请求对应的 api 处理返回结果
代码如下
client := &http.Client{}
reqest, err := http.NewRequest("GET", url, nil)
response, _ := client.Do(reqest)
body, err := ioutil.ReadAll(response.Body)
v := // 这里的 v 应该用什么数据
err = json.Unmarshal([]byte(body), &v)
如上面代码中的 v 应该用什么数据来处理
假如我返回的 json 如下
{
"code": 0,
"msg": "success",
"data": [
{
"id": 5,
"router": "vfile"
},
{
"id": 6,
"router": "test"
},
]
code 值 = v["code"],但是我如果要取 data 里面的值应该怎么取? v["data"][0]["id"] ,v["data"][0] 都报错
没有提前初始化 map 内容的好像支持 ````v.xxx``` `取值?
实际结果 json 的嵌套远比上面的还是深
刚接触 go,还请各位大佬指点指点!
1
DigDeeply 2018-12-27 12:29:11 +08:00 2
|
2
cuberlzy 2018-12-27 12:31:01 +08:00 1
这种时候 gjson 就派上用场了
|
3
likexian 2018-12-27 12:32:04 +08:00 1
1. 如果无法预先确定返回结构,就只能传个 interface 进去
2. 传 interface 进行,要取出来的时候,要做 type assert 建议用个库来处理下,会方便一些,比如: https://github.com/likexian/simplejson-go 使用方法参考例子 |
4
GeruzoniAnsasu 2018-12-27 12:33:35 +08:00 1
如果 json 的结构会改变
那只能是 struct 嵌 map[string]interface 然后再 type assert 再转 go 处理 json 并没有 那么 灵活 |
5
miyuki 2018-12-27 14:31:56 +08:00 1
这种时候还是用库吧
struct 要针对每个返回数据定义,如果是 nested 的 json 就比较麻烦… interface{} 取值也麻烦… |
6
winglq 2018-12-27 15:24:55 +08:00
api 返回固定的话我选 1
|
7
xujiaja 2018-12-27 16:56:51 +08:00 1
再提供一个第三方库 https://github.com/buger/jsonparser
|
8
reus 2018-12-27 17:40:46 +08:00
第一个有什么问题?用到什么字段就写什么,又不是一定要你定义好全部的才能用
|
9
wenzhoou 2018-12-27 18:22:54 +08:00 via Android 1
这 gjson 还真是不错啊
|
10
dabaibai 2018-12-27 23:11:14 +08:00 via iPhone
不喜欢反射相关的东西。。。
|
11
shuhao 2018-12-28 08:11:41 +08:00 via Android
选 1,针对每个 API 定义一个 struct.
|
12
kios 2018-12-28 11:19:53 +08:00
用 gjson 很方便的
|