Как получить доступ к глубоко вложенным данным JSON с помощью Go (lang)?

Как получить доступ к глубоко вложенным данным JSON с помощью Go (lang)?

18-10-2020 09:35:58
Чаще всего разработчику необходимо использовать данные JSON из другого сервиса и запрашивать их. Запросы к документу JSON занимают мало времени. Последние несколько дней я работал над пакетом для Golang, чтобы легко запрашивать данные JSON.

Давайте начнем с примера данных 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
]
}
}


Давайте найдем глубоко вложенное свойство и правильно обработаем ошибку, в этом случае мы попытаемся получить доступ nameсо второго элемента itemsмассива, обратите внимание: itemsэто свойство vendorобъекта. Смотрите пример ниже:


package main

import (
"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! Очень просто, верно? Похоже на работу с ORMданными JSON. Давайте посмотрим еще один пример запроса данных примера.

Пример 1


Запрос: select * from vendor.items where price > 1200 or id null

Используя gojsonq, мы можем сделать запрос следующим образом:


package main


import (
"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: name:HP core i3 SSD price:850]]
}


Пример 2


Запрос: select name, price from vendor.items where price > 1200 or id null

Используя gojsonq, мы можем сделать запрос следующим образом:


package main

import (
"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


Запрос: select sum(price) from vendor.items where price > 1200 or id null

Используя gojsonq, мы можем сделать запрос следующим образом:


package main

import (
"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


Запрос: select price from vendor.items where price > 1200

Используя gojsonq, мы можем сделать запрос следующим образом:


package main

import (
"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



Запрос: select * from vendor.items order by price

Используя gojsonq, мы можем сделать запрос следующим образом:


package main

import (
"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: 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 main

import (
"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"
}
}
]
}


Мы хотим выполнить запрос как этот:



Запрос: select * from users where name.first=John

Используя пакет, вы можете легко выполнить запрос, см. Фрагмент кода ниже:


package main

import (
"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 (.) Для таких методов, какWhere/GroupBy/SortBy etc

Примечание. Существуют и другие полезные методы, облегчающие жизнь! Если вам нравится пакет, не забудьте поделиться с вашим сообществом и пометить хранилище


САМОЕ ОБСУЖДАЕМОЕ

...
Титан в воздухе
18-10-2020 09:35:58
Это не самолет – это Мрия!!!...
...
Лучшие бюджетные ноутбуки на 2020 год
18-10-2020 09:35:59
Как выбрать лучший ноутбук в 2020 году...
...
Технологические тенденции в 2020 году
18-10-2020 09:35:59
Технологи будущего уже сегодня...
...
Самостоятельная поездка автомобиля под управлением искусственного интеллекта
18-10-2020 09:35:58
Самый далекий перезд без водителя в истории искуственного интеллекта....
...
Ford Bronco наконец дебютирует 9 июля
18-10-2020 09:35:58
После задержек, связанных с коронавирусом, у долгожданной Бронко Форда официально объявлена ​​дата....
...
Tesla Semi готова к «массовому производству»
18-10-2020 09:35:58
Но генеральный директор не указал точные сроки начала производства электрического грузовика....
...
25 самых продаваемых легковых автомобилей, грузовиков и внедорожников 2020 года (пока)
18-10-2020 09:35:58
Хотя пандемия коронавируса привела к хаосу в продажах автомобилей, мы подсчитали рейтинг самых продаваемых в первом квартале....
...
Электрический Mustang
18-10-2020 09:35:58
Ford представляет электрический Mustang с «потрясающим» ускорением...
...
Cамые большие дизайнерские моменты 2018 года
18-10-2020 09:35:59
Мы попросили дизайнеров рассказать нам, что они считают самой важной вещью, которая произошла в отрасли в этом году....
...
Airtable
18-10-2020 09:35:59
Простая в использовании система управления реляционными базами данных...

НАШИ РЕКОМЕНДАЦИИ

Toyota Supra в 2021 году
Toyota Supra в 2021 году
Toyota Supra 2020 года не получит дооснащения, чтобы соответствовать увеличению мощности в 2021 году...
9 различных вариантов использования console log
9 различных вариантов использования console log
Каждый из нас использовал console.logдля отладки больше, чем нам хотелось бы признать....
Расслабление, снятие стресса и развитие сознания
Расслабление, снятие стресса и развитие сознания
Иногда в жизни бывают дни.......
Послушай других и сделай наооборот
Послушай других и сделай наооборот
Основатель Tesla и SpaceX воплотил в жизнь одну идею, противоречащую общепринятому мнению, и это помогло ему заработать миллиарды....
Красный флаг или работа не Вашей мечты.
Красный флаг или работа не Вашей мечты.
В последнее время развелось (были всегда) много организаций на рынке - которые надо обходить стороной....


ИНТЕРЕСНОЕ

Понимание карты и набора в JavaScript
Понимание карты и набора в JavaScript
Эта статья была изначально написана для DigitalOcean ....
Lazareth Wazuma от Феррари
Lazareth Wazuma от Феррари
Lazareth Wazuma V8F Quad – Engine By Ferrari...
20 самых важных секретов настоящих отношений
20 самых важных секретов настоящих отношений
Не простые отношения между женщинами и мужчинами...
Работа в Швеции
Работа в Швеции
Компании в Швеции переходят на 6-часовые рабочие дни и добиваются удивительных результатов...


ЛУЧШИЕ РЕЙТИНГИ

Набор массы
Набор массы
Базовые принципы для новичков
Ежедневные 15-минутные прогулки способны кардинально изменить ваше тело
Ежедневные 15-минутные прогулки способны кардинально изменить ваше тело
Всем известно, как положительно влияют на организм...
Правила для наращивания мышечной массы
Правила для наращивания мышечной массы
Зная интенсивность физических упражнений...
Раскачать грудь
Раскачать грудь
Обычно грудные растут хорошо у тех...

АКТУАЛЬНОЕ

Будущее уже с нами Galaxy Fold
CEO продвижение
Отношения с мужчинами
Раздевалка
Лишь плохие начальники ожидают от своих подчиненных постоянной занятости
Как научиться читать быстрее
Выбирай того, кто ежедневно пишет тебе «С добрым утром»
США скрывают правду о пришельцах
Свечение от ракеты SpaceX американцы приняли за НЛО
Путешествие из Австрии в Италию

ЧИТАЙТЕ ТАКЖЕ

18-10-2020 09:35:59 (120052)
Какую одежду носят манхэттенские модницы летом
Возможно эта новость тебе еще неизвестна
18-10-2020 09:35:59 (120050)
Время сгибаемых смартфонов еще не пришло
Эксперт по технологиям издания Mashable Стэн Шредер написал колонку...
18-10-2020 09:35:59 (120049)
Успешные стартапы, которые начинали как сторонние проекты
Apple, Facebook, Google, SpaceX ...
18-10-2020 09:35:59 (120051)
Надо стараться быть с теми, кто к нам хорошо относится
Маленький гимназист очень плохо учился...
18-10-2020 09:35:59 (120044)
Стопроцентная диета для похудения или питание наоборот
Сделай все наоборот....
18-10-2020 09:35:59 (120046)
Невероятная 12-месячная трансформацией тела
Звезда фитнеса из Сиднея Софи Аллен рассказывает о своей трансформации..