请教各位大佬一个 go 处理 json 问题

2018-12-27 12:20:29 +08:00
 imherer

场景是用 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 应该用什么数据来处理

  1. struct:这个确实可以,但是不同的 api 返回的 json 数据结构不一样,这样的话得针对每个 api 定义一个 struct
  2. make(map[string]interface{}):这个解析完全没问题,主要是在取值的时候有点问题
  3. v = interface{}:这个结果好像和 2 是一样的

假如我返回的 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,还请各位大佬指点指点!

2818 次点击
所在节点    程序员
12 条回复
DigDeeply
2018-12-27 12:29:11 +08:00
可以用这种第三方库来获取 json 数据
https://github.com/tidwall/gjson
https://github.com/thedevsaddam/gojsonq
cuberlzy
2018-12-27 12:31:01 +08:00
这种时候 gjson 就派上用场了
likexian
2018-12-27 12:32:04 +08:00
1. 如果无法预先确定返回结构,就只能传个 interface 进去
2. 传 interface 进行,要取出来的时候,要做 type assert

建议用个库来处理下,会方便一些,比如: https://github.com/likexian/simplejson-go 使用方法参考例子
GeruzoniAnsasu
2018-12-27 12:33:35 +08:00
如果 json 的结构会改变
那只能是 struct 嵌 map[string]interface 然后再 type assert 再转
go 处理 json 并没有 那么 灵活
miyuki
2018-12-27 14:31:56 +08:00
这种时候还是用库吧

struct 要针对每个返回数据定义,如果是 nested 的 json 就比较麻烦…
interface{} 取值也麻烦…
winglq
2018-12-27 15:24:55 +08:00
api 返回固定的话我选 1
xujiaja
2018-12-27 16:56:51 +08:00
再提供一个第三方库 https://github.com/buger/jsonparser
reus
2018-12-27 17:40:46 +08:00
第一个有什么问题?用到什么字段就写什么,又不是一定要你定义好全部的才能用
wenzhoou
2018-12-27 18:22:54 +08:00
这 gjson 还真是不错啊
dabaibai
2018-12-27 23:11:14 +08:00
不喜欢反射相关的东西。。。
shuhao
2018-12-28 08:11:41 +08:00
选 1,针对每个 API 定义一个 struct.
kios
2018-12-28 11:19:53 +08:00
用 gjson 很方便的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/521474

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX