如何用Go訪問深層嵌套的JSON資料?

來源:互聯網
上載者:User

原文來自https://hashnode.com/post/how...

大多數情況下,開發人員需要使用來自其他服務的JSON資料並對其進行查詢。查詢JSON文檔非常耗時。在過去的幾天裡,我正在為Golang編寫一個包,以便輕鬆查詢JSON資料。這個想法和靈感來自 Nahid Bin Azhar的PHP-JSONQ。

我們來看一個樣本JSON資料:

{   "name":"computers",   "description":"List of computer products",   "vendor":{      "name":"Star Trek",      "email":"info@example.com",      "website":"www.example.com",      "items":[         {"id":1, "name":"MacBook Pro 13 inch retina","price":1350},         {"id":2, "name":"MacBook Pro 15 inch retina", "price":1700},         {"id":3, "name":"Sony VAIO", "price":1200},         {"id":4, "name":"Fujitsu", "price":850},         {"id":5, "name":"HP core i5", "price":850, "key": 2300},         {"id":6, "name":"HP core i7", "price":950},         {"id":null, "name":"HP core i3 SSD", "price":850}      ],      "prices":[         2400,         2100,         1200,         400.87,         89.90,         150.10     ]   }}

讓我們找到一個深度嵌套的屬性並正確處理錯誤,在這種情況下,我們將嘗試<font color="red" >name</font>從<font color="red">items</font>數組的第二個元素進行訪問,注意:<font color=red>items</font>是<font color="red" >vendor</font>對象的屬性。
請參閱以下樣本:

package mainimport (    "fmt"    "log"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.Find("vendor.items.[1].name")    if jq.Error() != nil {        log.Fatal(jq.Errors())    }    fmt.Println(res)}

Yahooooo!很簡單吧?它看起來像使用ORMJSON資料。讓我們看一些更多樣本來查詢樣本資料。

例1

查詢: <font color=red>select * from vendor.items where price > 1200 or id null</font>

使用 gojsonq 我們可以執行以下查詢:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.From("vendor.items").Where("price", ">", 1200).OrWhere("id", "=", nil).Get()    fmt.Println(res)    // output: [map[price:1350 id:1 name:MacBook Pro 13 inch retina] map[id:2 name:MacBook Pro 15 inch retina price:1700] map[id:<nil> name:HP core i3 SSD price:850]]}

例2

查詢:<font color=red> select name, price from vendor.items where price > 1200 or id null</font>

使用 gojsonq 我們可以執行以下查詢:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.From("vendor.items").Where("price", ">", 1200).OrWhere("id", "=", nil).Only("name", "price")    fmt.Println(res)    // output: [map[name:MacBook Pro 13 inch retina price:1350] map[name:MacBook Pro 15 inch retina price:1700] map[name:HP core i3 SSD price:850]]}

例3

查詢:<font color=red> select sum(price) from vendor.items where price > 1200 or id null</font>

使用 gojsonq 我們可以執行以下查詢:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.From("vendor.items").Where("price", ">", 1200).OrWhere("id", "=", nil).Sum("price")    fmt.Println(res)    // output: 3900}

例4

查詢: <font color=red>select price from vendor.items where price > 1200</font>

使用 gojsonq 我們可以執行以下查詢:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.From("vendor.items").Where("price", ">", 1200).Pluck("price")    fmt.Println(res)    // output: [1350 1700]}

例5

查詢:<font color=red> select * from vendor.items order by price</font>

使用 gojsonq 我們可以執行以下查詢:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./sample-data.json")    res := jq.From("vendor.items").SortBy("price").Get()    fmt.Println(res)    // output: [map[id:<nil> name:HP core i3 SSD price:850] map[id:4 name:Fujitsu price:850] map[id:5 name:HP core i5 price:850 key:2300] map[id:6 name:HP core i7 price:950] map[id:3 name:Sony VAIO price:1200] map[id:1 name:MacBook Pro 13 inch retina price:1350] map[id:2 name:MacBook Pro 15 inch retina price:1700]]}

例6

使用 gojsonq 您可以正確處理錯誤,請參閱下面的程式碼片段:

package mainimport (    "log"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./invalid-file.xjsn")    err := jq.Error()    if err != nil {        log.Fatal(err)        // 2018/06/25 00:48:58 gojsonq: open ./invalid-file.xjsn: no such file or directory        // exit status 1    }}

例7

假設我們有一個像這樣的JSON文檔

{  "users":[    {      "id":1,      "name":{        "first":"John",        "last":"Ramboo"      }    },    {      "id":2,      "name":{        "first":"Ethan",        "last":"Hunt"      }    },    {      "id":3,      "name":{        "first":"John",        "last":"Doe"      }    }  ]}

我們想要運行這樣的查詢:

查詢:<font color=red> select * from users where name.first=John</font>

使用該軟體包可以輕鬆進行查詢,請參閱下面的程式碼片段:

package mainimport (    "fmt"    "github.com/thedevsaddam/gojsonq")func main() {    jq := gojsonq.New().File("./data.json")    res := jq.From("users").WhereEqual("name.first", "John").Get()    fmt.Println(res) //output: [map[id:1 name:map[first:John last:Ramboo]] map[id:3 name:map[first:John last:Doe]]]}

您可以使用DOT(。)訪問嵌套層級屬性,例如<font color=red>Where/GroupBy/SortBy etc</font>

注意:還有一些其他有用的方法可以讓生活更輕鬆!如果您喜歡該軟體包,請不要忘記與您的社區分享並為存放庫加註星標

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.