V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imherer
V2EX  ›  程序员

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

  •  
  •   imherer · 2018-12-27 12:20:29 +08:00 · 2788 次点击
    这是一个创建于 2160 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景是用 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,还请各位大佬指点指点!

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

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

    struct 要针对每个返回数据定义,如果是 nested 的 json 就比较麻烦…
    interface{} 取值也麻烦…
    winglq
        6
    winglq  
       2018-12-27 15:24:55 +08:00
    api 返回固定的话我选 1
    xujiaja
        7
    xujiaja  
       2018-12-27 16:56:51 +08:00   ❤️ 1
    再提供一个第三方库 https://github.com/buger/jsonparser
    reus
        8
    reus  
       2018-12-27 17:40:46 +08:00
    第一个有什么问题?用到什么字段就写什么,又不是一定要你定义好全部的才能用
    wenzhoou
        9
    wenzhoou  
       2018-12-27 18:22:54 +08:00 via Android   ❤️ 1
    这 gjson 还真是不错啊
    dabaibai
        10
    dabaibai  
       2018-12-27 23:11:14 +08:00 via iPhone
    不喜欢反射相关的东西。。。
    shuhao
        11
    shuhao  
       2018-12-28 08:11:41 +08:00 via Android
    选 1,针对每个 API 定义一个 struct.
    kios
        12
    kios  
       2018-12-28 11:19:53 +08:00
    用 gjson 很方便的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1014 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:06 · PVG 05:06 · LAX 13:06 · JFK 16:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.