<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【GoCN酷Go推薦】GJSON的使用

          共 7069字,需瀏覽 15分鐘

           ·

          2021-03-17 19:31

          初心


          用最少的口水話把一個(gè)庫,一個(gè)框架的用法講清楚,這才是酷go最有價(jià)值的地方。


          丫的就是一社畜,哥老倌兒,你不要在我面前說源碼,你把k8s全部讀了,docker也讀了,你就跑來問我懂不懂,我不要聽,不要聽...


          我就是個(gè)碼農(nóng),需要的是咋個(gè)用會(huì)你說的那些東西,需要知道那是個(gè)啥子玩意兒,你開口就是源碼,我用都沒用過聽你講啥子玩意兒?jiǎn)褈


          能不能給我一個(gè)Zone,直接給我講用法,不要口水話多,抽象聊原理,我又不好意思去問百度,那些人把一個(gè)人工智能都能吹成妖魔鬼怪,我看了幾萬字,就總結(jié)了一句話:人工智能就是大量數(shù)據(jù)的存儲(chǔ),從而利用各種計(jì)算規(guī)則得出結(jié)果。


          酷go到底得不得行嘛,那肯定闊以滿足各位碼農(nóng)(社畜)嘞需求噻,這里邊兒莫得口水話,擼起褲子就是...噢不...擼起袖子直接干代碼的粗人,這里邊兒莫得那么多原理,喜歡看原理的都在最后放了github開源源碼,愛看不看~


          酷go里邊兒你可以遇到很多你喜歡的偶像,beego創(chuàng)始人,BAT的大佬等。


          Golang | Gjson庫



          簡(jiǎn)介 什么是Gjson:

          GJSON是一個(gè)Golang包,它提供了一種快速,簡(jiǎn)單的方法來從json格式文檔中獲取值。它擁有比如單行檢索,用"."符號(hào)來尋找路徑,迭代和解析多行json的功能。

          個(gè)人理解

          Gjson實(shí)際上就是一個(gè)比原生json解析更快更簡(jiǎn)單的一種工具,對(duì)于API來說,我不關(guān)心這個(gè)json格式是否有錯(cuò),我只需要關(guān)心這個(gè)json里面有沒有我想要的數(shù)據(jù),快速格式化成我想要的格式

          安裝


          GO MOD模式下,執(zhí)行:

          go get -u github.com/tidwall/gjson 

          直接獲取值


          我還是會(huì)由淺入深的給大家介紹這個(gè)庫的使用方法,如果我們拿到了一個(gè)json字符串的時(shí)候應(yīng)該這樣做:

          package main

          import (
           "fmt"
           "github.com/tidwall/gjson"
          )

          func main() {
           exampleJsonString := `{
              "code":"000",
              "data":{
                  "all_count":441353,
                  "lists":[
                      {
                          "id":441353,
                          "job_name":"經(jīng)營(yíng)日?qǐng)?bào)-同步職位信息",
                          "job_recall_time":"2021-03-13 15:05:04",
                          "job_recall_content":"請(qǐng)求成功:great",
                          "create_time":"2021-03-13 15:05:04"
                      },
                      {
                          "id":441352,
                          "job_name":"經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表",
                          "job_recall_time":"2021-03-13 15:05:00",
                          "job_recall_content":"請(qǐng)求成功:OK",
                          "create_time":"2021-03-13 15:05:00"
                      }
                  ]
              },
              "msg":"獲取列表成功",
              "success":true
          }`

           jsonCode := gjson.Get(exampleJsonString, "code")  //這個(gè)后面你可以繼續(xù)跟想要的結(jié)果類型,不加的話會(huì)是json字符串的類型
           fmt.Println(jsonCode) // 結(jié)果 000
           jsonOneJobName := gjson.Get(exampleJsonString,"data.lists.#.job_name").Array() //比如我這里就希望返回是一個(gè)切片類型
           fmt.Println(jsonOneJobName) // 結(jié)果 [經(jīng)營(yíng)日?qǐng)?bào)-同步職位信息 經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表]
          }

          上面的同學(xué)開始疑問了,如果我自己寫錯(cuò)了怎么辦,或者沒有那個(gè)key字段怎么辦,沒關(guān)系,你在獲取到了后,加上自己想要的判斷類型,再判斷一次是否為空即可。

          我都不需要定義任何結(jié)構(gòu)體,用最簡(jiǎn)單的辦法獲取到我想要的內(nèi)容

          路徑語法的快速概述:

          路徑語法的快速概述,以上面json字符串為例

          路徑結(jié)果解釋
          data.lists.#2獲取當(dāng)前json數(shù)組的長(zhǎng)度
          data.lists.1.job_name經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表獲取data下lists的索引為1的job_name值
          data.lists.#.job_name[經(jīng)營(yíng)日?qǐng)?bào)-同步職位信息 經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表]獲取data下lists下所有的job_name值

          還有一些路徑通配符,比如你有模糊查詢或者想在json取值時(shí)有判斷的需求,可查看官方文檔:https://github.com/tidwall/gjson

          返回函數(shù)


          列舉一些常用的返回函數(shù)使用

          package main
          // ...
          // ...

          fmt.Println(gjson.Get(exampleJsonString,"data.lists.1.create_time").Exists()) // 查看當(dāng)前路徑的值是否存在 結(jié)果 true
          fmt.Println(gjson.Get(exampleJsonString,"data.lists").IsArray()) //查看當(dāng)前路徑是否是json數(shù)組 結(jié)果 true
          fmt.Println(gjson.Get(exampleJsonString,"data.lists.0").IsObject()) //查看當(dāng)前路徑是否是一個(gè)json對(duì)象 結(jié)果 true
          gjson.Get(exampleJsonString,"data.lists.1").ForEach(func(key, value gjson.Result) bool {
            fmt.Println(value)
            return true
           }) 
          //獲取到路徑結(jié)果后,遍歷取值(其實(shí)覺得自己遍歷可讀性更高)
          fmt.Println(gjson.Get(exampleJsonString,"data.lists.1.id").Float()) //所有標(biāo)準(zhǔn)類型都可以獲取到,比如 Bool,Int,Value(這個(gè)是接口類型),Unit,String 

          直接解析bytes類型

          實(shí)際上,很多時(shí)候我們拿到的JSON數(shù)據(jù)都是從API中獲得,比如從http請(qǐng)求中獲得了body,之后ioutil.ReadAll獲得了[]byte類型的數(shù)據(jù)

          package main

          import (
           "fmt"
           "github.com/tidwall/gjson"
          )

          func main() {
           exampleJsonByte := []byte(`{
              "code":"000",
              "data":{
                  "all_count":441353,
                  "lists":[
                      {
                          "id":441353,
                          "job_name":"經(jīng)營(yíng)日?qǐng)?bào)-同步職位信息",
                          "job_recall_time":"2021-03-13 15:05:04",
                          "job_recall_content":"請(qǐng)求成功:great",
                          "create_time":"2021-03-13 15:05:04"
                      },
                      {
                          "id":441352,
                          "job_name":"經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表",
                          "job_recall_time":"2021-03-13 15:05:00",
                          "job_recall_content":"請(qǐng)求成功:OK",
                          "create_time":"2021-03-13 15:05:00"
                      }
                  ]
              },
              "msg":"獲取列表成功",
              "success":true
          }`
          )
           fmt.Println(gjson.GetBytes(exampleJsonByte, "data.lists.#.job_name").Array()) //好吧,結(jié)果一樣 [經(jīng)營(yíng)日?qǐng)?bào)-同步職位信息 經(jīng)營(yíng)日?qǐng)?bào)-Check張繼學(xué)列表]
          }

          總結(jié)

          GJSON真的太簡(jiǎn)單了,可以說是小白golang解析json數(shù)據(jù)的必備良品,如果涉及到多人開發(fā),需要用到同樣的接口結(jié)構(gòu)體,我建議還是老老實(shí)實(shí)的寫結(jié)構(gòu)體,畢竟數(shù)據(jù)模型的搭建是多人協(xié)同開發(fā)基礎(chǔ)之一。

          還想了解更多嗎?

          更多請(qǐng)查看:https://github.com/tidwall/gjson

          歡迎加入我們GOLANG中國社區(qū):https://gocn.vip/


          《酷Go推薦》招募:


          各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫或者好的項(xiàng)目,然后寫一點(diǎn)這個(gè)庫使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到新的庫,并且知道怎么用。


          大概規(guī)則和每日新聞?lì)愃疲绻麍?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名啊


          點(diǎn)擊 閱讀原文 即刻報(bào)名


          瀏覽 92
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩色情在线播放 | 欧美大屄视频 | 国产蜜臀在线观看 | 美女色综合网 | 少妇白浆视频 |