Κατανάλωση δεδομένων JSON API Web Χρήση curl και jq

3
Κατανάλωση δεδομένων JSON API Web Χρήση curl και jq

μπούκλα-jq

Γεια σε όλους! Αποφάσισα να βάλω μερικές επιπλέον μπαταρίες στο χρώμα φόντου της παραπάνω εικόνας του άρθρου. 🙂 Είμαι πραγματικά πολύ φορτισμένος με το θέμα μας σήμερα, ιδιαίτερα για το jq, ο οποίος είναι ένας ελαφρύς και ευέλικτος επεξεργαστής JSON γραμμής εντολών με «συμπεριλαμβανόμενες μπαταρίες».

Το JSON έχει γίνει η γλώσσα για την ανταλλαγή δεδομένων στον Ιστό και εμείς (ως προγραμματιστές) πρέπει να γνωρίζουμε πώς να επεξεργαζόμαστε τα δεδομένα JSON, ώστε να είμαστε τοποθετημένοι για το παρόν και το μέλλον. Σήμερα, κάνουμε μεγέθυνση και μαθαίνουμε για την κατανάλωση δεδομένων JSON API Web από το bash χρησιμοποιώντας curl και jq.

Περιεχόμενα άρθρου

Προετοιμάστε περιβάλλον

Θα εργαστούμε στο bash σήμερα, επομένως θα χρειαστεί να βρείτε μια μηχανή Linux για να το κάνετε αυτό. Προσωπικά τρέχω σε Raspberry Pi (Raspbian), αλλά αυτό το σεμινάριο θα λειτουργήσει εξίσου καλά σε οποιοδήποτε περιβάλλον που βασίζεται σε Linux. (Οι οδηγίες μου, ωστόσο, θα είναι προσανατολισμένες σε διανομές Linux που βασίζονται στο Debian, καθώς θα χρησιμοποιούμε το apt εντολή.) Για να ρυθμίσετε ένα Raspberry Pi, μπορείτε να ακολουθήσετε τις οδηγίες στον δημοφιλή μου Οδηγό αρχαρίων για την εγκατάσταση του Node.js σε ένα Raspberry Pi. Δεν θα χρειαστούμε το Node.js για αυτό το σεμινάριο. Ωστόσο, ο οδηγός για αρχάριους θα σας βοηθήσει να δημιουργήσετε ένα εκπληκτικό περιβάλλον ανάπτυξης που περιλαμβάνει προαιρετικά και το Node.js. Εάν δεν διαθέτετε ήδη περιβάλλον Linux, άλλες επιλογές μπορεί να περιλαμβάνουν την εκτέλεση του Ubuntu σε μια εικονική μηχανή.

Θα καταναλώσουμε δεδομένα Web API JSON με τη βοήθεια του σεβάσμιου curl εντολή για μεταφορά δεδομένων με χρήση http και άλλων πρωτοκόλλων. Ως πρώτο βήμα, συνδεθείτε στο σύστημά σας Linux και ξεκινήστε μια περίοδο λειτουργίας τερματικού για να επαληθεύσετε ότι το curl είναι εγκατεστημένο (αν εκτελείτε το Raspbian, curl αποστέλλεται με την εικόνα βάσης):

$ which curl
/usr/bin/curl

Το βλέπουμε αυτό usr/bin/curl επιστρέφεται για να ξέρουμε curl είναι εγκατεστημένο. Εάν δεν επιστραφεί τίποτα, θα χρειαστεί να εγκαταστήσετε το curl:

$ sudo apt install curl

Επισκόπηση API web Weather – τρέχουσες καιρικές συνθήκες

Όπως είπε κάποτε ο Μαρκ Τουέιν (ή μήπως ο Τσαρλς Ντάντλεϊ Γουόρνερ;) «Όλοι μιλούν για τον καιρό, αλλά κανείς δεν κάνει τίποτα γι‘ αυτό». Σήμερα, θα κάνουμε κάτι για αυτό! (Ίσως όχι :), αλλά θα αποκτήσουμε τουλάχιστον κάποια επίγνωση της κατάστασης, ώστε να ξέρουμε τι μας οδηγεί.)

Δεν θα ήταν ωραίο αν μπορούσαμε να κόψουμε σε κομμάτια τα δεδομένα JSON που επιστράφηκαν από ένα Weather Web API και να λάβουμε τις τρέχουσες και προγνωστικές καιρικές συνθήκες; Μην φοβάστε όλοι… Σας έχω καλύψει. 🙂 Δημιούργησα μια μικρουπηρεσία καιρού χρησιμοποιώντας τις λειτουργίες Azure στην Python για το σημερινό μας σεμινάριο. Ας εστιάσουμε πρώτα στην κατανάλωση δεδομένων JSON για να λάβουμε τις τρέχουσες καιρικές συνθήκες:

ο current Η συνάρτηση δέχεται δύο παραμέτρους:

  • τοποθεσία: τοποθεσία (παράδειγμα: Σαν Ντιέγκο, Καλιφόρνια)
  • deg: τύπος βαθμού (F ή C) Η προεπιλογή είναι F.

Παράδειγμα: Επιστρέψτε ένα αντικείμενο JSON με τις τρέχουσες πληροφορίες καιρού (βαθμοί C)

https://thisdavej.azurewebsites.net/api/weather/current?loc=San Diego, CA&deg=C

Αυτό θα επιστρέψει το ακόλουθο αντικείμενο JSON:

{
  "temperature": "18",
  "skycode": "32",
  "skytext": "Sunny",
  "date": "2016-11-23",
  "observationtime": "10:15:00",
  "observationpoint": "San Diego, CA",
  "feelslike": "18",
  "humidity": "68",
  "winddisplay": "2 km/h East",
  "day": "Wednesday",
  "shortday": "Wed",
  "windspeed": "2 km/h",
  "imageUrl": "http://blob.weather.microsoft.com/static/weather4/en-us/law/32.gif",
  "degType": "C"
}

Ορίστε το έχετε. Τέλεια, είμαστε έτοιμοι να δημιουργήσουμε το πρώτο μας σενάριο για να ανακτήσουμε τον τρέχοντα καιρό από τη μικρουπηρεσία μας που βασίζεται στο cloud!

Λάβετε ακατέργαστα δεδομένα JSON για τον τρέχοντα καιρό χρησιμοποιώντας το curl

Αρχικά, δημιουργήστε ένα σενάριο bash που ονομάζεται weather.sh και προσθέστε τα ακόλουθα περιεχόμενα:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/current?loc=$LOCATION&deg=$DEG")

echo $content

Αυτή η εντολή δέχεται δύο παραμέτρους από τη γραμμή εντολών για τη θέση (γραμμή 3) και τον τύπο βαθμού (F ή C) στη γραμμή 4.

Στη γραμμή 7, χρησιμοποιούμε sed to HTML encode κενά διαστήματα στο LOC Η παράμετρος πέρασε από τη γραμμή εντολών έτσι ώστε το „San Diego, CA“ να γίνει „San%20Diego,%20CA“ όταν καλείται μέσω μιας διεύθυνσης URL.

Στη γραμμή 9, χρησιμοποιούμε curl να ξεκινήσει μια HTTP GET έναντι της διαδικτυακής μας υπηρεσίας και να επιστρέψετε τα τρέχοντα δεδομένα καιρού. Επικαλούμαστε μπούκλα χρησιμοποιώντας curl -sS. Αυτές οι παράμετροι επιτυγχάνουν τα εξής:

  • -s: Εκκινεί το curl σε αθόρυβη λειτουργία, ώστε να μην εμφανίζει σφάλματα ή μετρητή προόδου κατά τη λήψη των αποτελεσμάτων του Web API.
  • -S: Όταν χρησιμοποιείται με -s Εμφανίζει ένα μήνυμα σφάλματος εάν η μπούκλα αποτύχει.

Δείτε το μπούκλα man page για πρόσθετες διαθέσιμες επιλογές.

Τέλος, στη γραμμή 10, επαναλαμβάνουμε το περιεχόμενο που έχετε λάβει στο τερματικό.

Για να μπορέσουμε να χρησιμοποιήσουμε την εντολή μας, ίσως χρειαστεί να ορίσουμε το bit execute:

$ chmod u+x weather.sh

Στη συνέχεια, βρισκόμαστε σε θέση να εκκινήσουμε την εντολή που δημιουργήθηκε πρόσφατα:

$ ./weather.sh "San Diego, CA"

Θα πρέπει να δείτε ένα αποτέλεσμα που μοιάζει με αυτό:

{ "temperature": "66", "skycode": "32", "skytext": "Sunny", "date": "2016-11-23", "observationtime": "10:45:00", "observationpoint": "San Diego, CA", "feelslike": "66", "humidity": "68", "winddisplay": "1 mph East", "day": "Wednesday", "shortday": "Wed", "windspeed": "1 mph", "imageUrl": "http://blob.weather.microsoft.com/static/weather4/en-us/law/32.gif", "degType": "F" }

Η τρέχουσα πρόγνωση του καιρού μας επιστράφηκε, αλλά είναι αρκετά ακατάστατη και δύσκολο να ερμηνευτεί. Ας το καθαρίσουμε.

Επεξεργαστείτε τα τρέχοντα καιρικά δεδομένα JSON χρησιμοποιώντας jq

Όμορφα τρέχοντα δεδομένα εκτύπωσης

Ας βελτιώσουμε την ικανότητά μας να εργαζόμαστε με δεδομένα JSON API Web με τη βοήθεια του jq, ένας ελαφρύς και ευέλικτος επεξεργαστής JSON γραμμής εντολών. Ως πρώτο βήμα, ας εγκαταστήσουμε το jq:

$ sudo apt install jq

Εξοχος! Τώρα είμαστε έτοιμοι να ενισχύσουμε το παιχνίδι JSON μας και να προχωρήσουμε πέρα ​​από την κηλίδα κειμένου που βλέπουμε αυτήν τη στιγμή να επιστρέφεται στο πρώτο μας σενάριο.

Τροποποιήστε το υπάρχον σας weather.sh γράψτε ή δημιουργήστε ένα νέο και προσθέστε τα ακόλουθα περιεχόμενα:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/current?loc=$LOCATION&deg=$DEG")

echo $content | jq .

Αυτό το σενάριο είναι πανομοιότυπο με το τελευταίο μας σενάριο, αλλά τώρα διοχετεύουμε τα αποτελέσματά μας jq. ο jq . Η εντολή επεξεργάζεται το JSON που επιστράφηκε και το εκτυπώνει όμορφα.

Ας το δοκιμάσουμε:

$ ./weather.sh "San Diego, CA"

Ακολουθούν μερικά δείγματα αποτελεσμάτων:

{
  "temperature": "67",
  "skycode": "32",
  "skytext": "Sunny",
  "date": "2016-11-23",
  "observationtime": "11:10:00",
  "observationpoint": "San Diego, CA",
  "feelslike": "67",
  "humidity": "66",
  "winddisplay": "4 mph Northwest",
  "day": "Wednesday",
  "shortday": "Wed",
  "windspeed": "4 mph",
  "imageUrl": "http://blob.weather.microsoft.com/static/weather4/en-us/law/32.gif",
  "degType": "F"
}

Α, ναι. Τα αποτελέσματά μας φαίνονται πολύ πιο ευανάγνωστα! ο jq η εντολή είναι ικανή για πολλά περισσότερα όπως θα δούμε σύντομα.

Επιστρέψτε ένα χαρακτηριστικό JSON

Ας τροποποιήσουμε το σενάριό μας για να επιστρέψουμε μόνο το temperature κλειδί του καιρού αντικειμένου JSON:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/current?loc=$LOCATION&deg=$DEG")

echo $content | jq .temperature

Παρατηρήστε ότι μόλις αλλάξαμε την τελευταία γραμμή του σεναρίου μας για να επιστρέψουμε μόνο το temperature χαρακτηριστικό του αντικειμένου JSON μας. Θα πρέπει να δείτε τα ακόλουθα αποτελέσματα:

"67"

Πολύ ωραία!

Επιστρέψτε πολλά χαρακτηριστικά JSON

Τι γίνεται αν θέλουμε να επιστρέψουμε περισσότερα από ένα χαρακτηριστικά από το τρέχον αντικείμενο καιρού JSON μας; Δείτε πώς το κάνουμε:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/current?loc=$LOCATION&deg=$DEG")

echo $content | jq -r '. | "\(.temperature)°\(.degType) \(.skytext)"'

Εδώ είναι το αποτέλεσμά μας:

67°F Sunny

Κάναμε μερικές αλλαγές στην τελευταία γραμμή του σεναρίου μας. Επικαλούμαστε jq με -r (ακατέργαστη έξοδος), επομένως το αποτέλεσμα δεν μορφοποιείται πλέον ως συμβολοσειρά JSON με εισαγωγικά. Αυτό επιτρέπει στο σενάριο να επιστρέψει 67°F Sunny αντί "67°F Sunny".

Δεύτερον, χρησιμοποιούμε έναν σωλήνα (|) στο jq και πάρτε το degType και skytext Χαρακτηριστικά JSON επιπλέον του temperature. Σημειώστε επίσης τη χρήση της σύνταξης ανάστροφης κάθετου και παρενθέσεων \(.temperature) για να ανακτήσετε ένα δεδομένο χαρακτηριστικό JSON, όπως temperature.

Επισκόπηση API web Weather – πρόβλεψη καιρικών συνθηκών

Πιστεύω ότι έχουμε καλύψει επαρκώς την επεξεργασία του τρέχοντος καιρού αντικειμένου JSON. Ας προχωρήσουμε και ας επεξεργαστούμε ορισμένα δεδομένα JSON που παρέχουν την πρόγνωση του καιρού. Αυτό θα μας δώσει επίσης την ευκαιρία να μάθουμε πώς να επεξεργαζόμαστε πίνακες αντικειμένων JSON.

ο forecast Η συνάρτηση δέχεται επίσης δύο παραμέτρους:

  • τοποθεσία: τοποθεσία (παράδειγμα: Σαν Ντιέγκο, Καλιφόρνια)
  • deg: τύπος βαθμού (F ή C) Η προεπιλογή είναι F.

Παράδειγμα: Επιστρέψτε ένα αντικείμενο JSON με τις πληροφορίες πρόγνωσης καιρού (βαθμοί C)

https://thisdavej.azurewebsites.net/api/weather/forecast?loc=San Diego, CA&deg=C

Αυτό θα επιστρέψει ένα αντικείμενο JSON με το εξής σχήμα:

[
 {
 "low": "12",
 "high": "20",
 "skycodeday": "31",
 "skytextday": "Clear",
 "date": "2016-11-23",
 "day": "Tuesday",
 "shortday": "Tue",
 "precip": "0",
 "degType": "C"
 },
 {
 "low": "12",
 "high": "19",
 "skycodeday": "28",
 "skytextday": "Mostly Cloudy",
 "date": "2016-11-23",
 "day": "Wednesday",
 "shortday": "Wed",
 "precip": "0",
 "degType": "C"
 },
 {
 "low": "11",
 "high": "24",
 "skycodeday": "32",
 "skytextday": "Sunny",
 "date": "2016-11-24",
 "day": "Thursday",
 "shortday": "Thu",
 "precip": "0",
 "degType": "C"
 },
 {
 "low": "12",
 "high": "21",
 "skycodeday": "32",
 "skytextday": "Sunny",
 "date": "2016-11-25",
 "day": "Friday",
 "shortday": "Fri",
 "precip": "0",
 "degType": "C"
 },
 {
 "low": "14",
 "high": "18",
 "skycodeday": "30",
 "skytextday": "Partly Sunny",
 "date": "2016-11-26",
 "day": "Saturday",
 "shortday": "Sat",
 "precip": "80",
 "degType": "C"
 }]

Όπως μπορείτε να δείτε, η συνάρτηση πρόβλεψης καιρού επιστρέφει ένα αντικείμενο JSON που περιέχει μια σειρά από πέντε αντικείμενα που παρέχουν τα δεδομένα πρόγνωσης καιρού.

Λάβετε ακατέργαστα δεδομένα JSON για πρόγνωση καιρού χρησιμοποιώντας το curl

Ας ξεκινήσουμε επιστρέφοντας ακατέργαστα δεδομένα:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/forecast?loc=$LOCATION&deg=$DEG")

echo $content

Βλέπουμε να επιστρέφονται τα εξής:

[ { "low": "53", "high": "67", "skycodeday": "31", "skytextday": "Clear", "date": "2016-11-22", "day": "Tuesday", "shortday": "Tue", "precip": "0", "degType": "F" }, { "low": "54", "high": "67", "skycodeday": "28", "skytextday": "Mostly Cloudy", "date": "2016-11-23", "day": "Wednesday", "shortday": "Wed", "precip": "0", "degType": "F" }, { "low": "52", "high": "75", "skycodeday": "32", "skytextday": "Sunny", "date": "2016-11-24", "day": "Thursday", "shortday": "Thu", "precip": "0", "degType": "F" }, { "low": "53", "high": "70", "skycodeday": "32", "skytextday": "Sunny", "date": "2016-11-25", "day": "Friday", "shortday": "Fri", "precip": "0", "degType": "F" }, { "low": "58", "high": "65", "skycodeday": "30", "skytextday": "Partly Sunny", "date": "2016-11-26", "day": "Saturday", "shortday": "Sat", "precip": "80", "degType": "F" } ]

Νομίζω ότι είναι δίκαιο να πούμε ότι αυτό είναι αρκετά ακατάστατο. 🙂

Επεξεργαστείτε τα δεδομένα JSON πρόβλεψης καιρού χρησιμοποιώντας jq

Όμορφα έντυπα δεδομένα πρόβλεψης

Ας αρχίσουμε να χρησιμοποιούμε το jq και ας κάνουμε μια όμορφη εκτύπωση του JSON που επιστράφηκε:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/forecast?loc=$LOCATION&deg=$DEG")

echo $content | jq .

Όπως μπορείτε να μαντέψετε, τα αποτελέσματα που επιστράφηκαν μοιάζουν πολύ με τα αποτελέσματα JSON που παρουσιάζονται παραπάνω στην παραπάνω περιγραφή του API. Δεν θα τα ξανατυπώσω εδώ για να αποφύγω τον πλεονασμό.

Επιστρέψτε ένα χαρακτηριστικό από κάθε αντικείμενο JSON σε έναν πίνακα

Τι γίνεται αν θέλουμε να εκτυπώσουμε απλώς ένα χαρακτηριστικό από καθένα από τα αντικείμενα JSON στον πίνακα; Ας το κάνουμε τώρα:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/forecast?loc=$LOCATION&deg=$DEG")

echo $content | jq -r '.[] .shortday'

ο .[] σύνταξη επιστρέφει όλα τα στοιχεία από τον πίνακα και εκτυπώνουμε το shortday Χαρακτηριστικό JSON από κάθε αντικείμενο. Για άλλη μια φορά, χρησιμοποιούμε jq -r για να αφαιρέσετε τα διπλά εισαγωγικά από κάθε αντικείμενο JSON που επιστρέφεται. Εδώ είναι τα αποτελέσματα:

Tue
Wed
Thu
Fri
Sat

Πολύ ωραία! Μια πρόγνωση καιρού που επιστρέφει μόνο την ημέρα της εβδομάδας δεν είναι πολύ διορατική. 🙂

Επιστρέψτε πολλαπλά χαρακτηριστικά από κάθε αντικείμενο JSON σε έναν πίνακα

Ας πάρουμε πολλαπλά χαρακτηριστικά από κάθε αντικείμενο JSON στον πίνακα:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/forecast?loc=$LOCATION&deg=$DEG")

echo $content | jq -r '.[] | "\(.shortday) \(.low)-\(.high)°\(.degType) \(.skytextday) ~ Rain: \(.precip)%"'

Το βλέπουμε τώρα αυτό jq χρησιμοποιεί έναν σωλήνα (|) μέσω, ώστε να μπορούν να εμφανίζονται τα χαρακτηριστικά κάθε αντικειμένου JSON.
Τώρα θα δείτε αποτελέσματα που μοιάζουν κάπως έτσι:

Tue 53-67°F Clear ~ Rain: 0%
Wed 54-67°F Mostly Cloudy ~ Rain: 0%
Thu 52-75°F Sunny ~ Rain: 0%
Fri 53-70°F Sunny ~ Rain: 0%
Sat 58-65°F Partly Sunny ~ Rain: 80%

Επιστρέψτε ένα υποσύνολο αντικειμένων JSON σε έναν πίνακα που βασίζεται σε ευρετήρια

Τι γίνεται αν θέλουμε να δούμε μόνο τα δύο πρώτα στοιχεία του πίνακα JSON; Μπορούμε να το κάνουμε και αυτό:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/forecast?loc=$LOCATION&deg=$DEG")

echo $content | jq -r '.[0,1] | "\(.shortday) \(.low)-\(.high)°\(.degType) \(.skytextday) ~ Rain: \(.precip)%"'

Όπως μπορείτε να δείτε στην τελευταία γραμμή, επιστρέφουμε μόνο τα δύο πρώτα στοιχεία [0,1] στον πίνακα αντικειμένων JSON.

Εδώ είναι τα αποτελέσματα:

Tue 53-67°F Clear ~ Rain: 0%
Wed 54-67°F Mostly Cloudy ~ Rain: 0%

Επιστρέψτε ένα υποσύνολο αντικειμένων JSON με βάση κριτήρια επιλογής

Μπορούμε επίσης να επιλέξουμε μόνο ορισμένα αντικείμενα στον πίνακα JSON που θα επιστραφούν βάσει κριτηρίων. Για παράδειγμα, ας επιστρέψουμε τα αντικείμενα πρόβλεψης μόνο για ημέρες που μπορεί να βρέχει:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/forecast?loc=$LOCATION&deg=$DEG")

echo $content | jq -r '.[] | select(.precip | tonumber > 0) | "\(.shortday) \(.low)-\(.high)°\(.degType) \(.skytextday) ~ Rain: \(.precip)%"'

Αυτή η σύνταξη jq επιλέγει αντικείμενα στον πίνακα JSON όπου η κατακρήμνιση προβλέπεται να είναι μεγαλύτερη από το μηδέν. Παρακαλούμε να σημειώσετε ότι

Αυτό επιστρέφει τα ακόλουθα αποτελέσματα:

Sat 58-65°F Partly Sunny ~ Rain: 80%

Τι λέτε για αυτό; Βρέχει σπάνια στο Σαν Ντιέγκο, αλλά φαίνεται ότι μπορεί να βρέξει πραγματικά το Σάββατο. Χαίρομαι που έχω αυτό το σενάριο για να με βοηθήσει. 😉

Επιστρέψτε έναν ταξινομημένο πίνακα αντικειμένων JSON

Μπορούμε να ταξινομήσουμε τη σειρά των αντικειμένων που επιστράφηκαν από την κλήση του JSON Web API; Βάζεις στοίχημα! Ας ταξινομήσουμε με βάση τη χαμηλή θερμοκρασία:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/forecast?loc=$LOCATION&deg=$DEG")

echo $content | jq -r '. | sort_by(.low) | .[] | "\(.shortday) \(.low)-\(.high)°\(.degType) \(.skytextday) ~ Rain: \(.precip)%"'

Αυτό επιστρέφει τα ακόλουθα αποτελέσματα:

Thu 52-75°F Sunny ~ Rain: 0%
Tue 53-67°F Clear ~ Rain: 0%
Fri 53-70°F Sunny ~ Rain: 0%
Wed 54-67°F Mostly Cloudy ~ Rain: 0%
Sat 58-65°F Partly Sunny ~ Rain: 80%

Τι θα λέγατε για την ταξινόμηση με φθίνουσα σειρά; Ναι, όντως με τη βοήθεια του jq reverse λειτουργία…

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/forecast?loc=$LOCATION&deg=$DEG")

echo $content | jq -r '. | sort_by(.low) | reverse | .[] | "\(.shortday) \(.low)-\(.high)°\(.degType) \(.skytextday) ~ Rain: \(.precip)%"'

Τα αποτελέσματα, ταξινομημένα σε φθίνουσα σειρά ανά χαμηλή θερμοκρασία, μοιάζουν με αυτό:

Sat 58-65°F Partly Sunny ~ Rain: 80%
Wed 54-67°F Mostly Cloudy ~ Rain: 0%
Fri 53-70°F Sunny ~ Rain: 0%
Tue 53-67°F Clear ~ Rain: 0%
Thu 52-75°F Sunny ~ Rain: 0%

Επιστρέψτε τη μέγιστη τιμή ενός δεδομένου χαρακτηριστικού σε έναν πίνακα αντικειμένων JSON

Μπορούμε επίσης να επιστρέψουμε μόνο τη μέγιστη τιμή χρησιμοποιώντας jq’s max_by λειτουργία. Ας εμφανίσουμε τη μέγιστη θερμοκρασία που προβλέπεται στην πρόγνωση:

#!/bin/bash

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/forecast?loc=$LOCATION&deg=$DEG")

echo $content | jq -r '. | max_by(.high) | "\(.shortday) \(.low)-\(.high)°\(.degType) \(.skytextday) ~ Rain: \(.precip)%"'

Εμφανίζεται η μέγιστη προβλεπόμενη θερμοκρασία:

Thu 52-75°F Sunny ~ Rain: 0%

Δεν αποτελεί έκπληξη το γεγονός ότι το jq παρέχει επίσης α min_by λειτουργία επίσης.

Χρησιμοποιήστε τη λογική υπό όρους για να ελέγξετε τα αποτελέσματα που εμφανίζονται

Τέλος, ας χρησιμοποιήσουμε κάποια λογική υπό όρους για να ελέγξουμε ποιες πληροφορίες εμφανίζονται. Ας δώσουμε κάποιες οδηγίες για να φέρουμε μια ομπρέλα τις ημέρες όπου η πιθανότητα βροχής (υετού) προβλέπεται να είναι μεγαλύτερη από 20%:

#!/bin/bash

if (( $# < 1 ))
then
  echo "Usage: $(basename "$0") location [degreeType]"
  echo "Example: $(basename "$0") \"San Diego, CA\" F"
  exit 1
fi

LOC="$1"
DEG="$2"

# HTML encode string as %20
LOCATION=$(sed -e "s/ /%20/g" <<<"$LOC")

content=$(curl -sS "https://thisdavej.azurewebsites.net/api/weather/forecast?loc=$LOCATION&deg=$DEG")

echo $content | jq -r '.[] | "\(.shortday) \(.low)-\(.high)°\(.degType) \(.skytextday) ~ Rain: \(.precip)% \(if (.precip | tonumber > 20) then "(Bring umbrella!)" else "" end)"'

Σε αυτό το τελικό σενάριο, χρησιμοποιούμε το jq if-then-else για εμφάνιση (Bring umbrella!) εάν η πιθανότητα βροχής είναι μεγαλύτερη από 20 τοις εκατό. Εδώ είναι τα αποτελέσματα:

Tue 53-67°F Clear ~ Rain: 0%
Wed 54-67°F Mostly Cloudy ~ Rain: 0%
Thu 52-75°F Sunny ~ Rain: 0%
Fri 53-70°F Sunny ~ Rain: 0%
Sat 58-65°F Partly Sunny ~ Rain: 80% (Bring umbrella!)

Η ικανότητα γραμμής εντολών της εντολής jq είναι απίστευτη!

Μπορεί επίσης να παρατηρήσετε ότι προσθέσαμε μια τελευταία πινελιά στο σενάριό μας και συμπεριλάβαμε κάποια λογική στο επάνω μέρος για να διασφαλίσουμε ότι παρέχεται τουλάχιστον μία παράμετρος. Εάν όχι, παρέχεται κείμενο χρήσης εντολών. Ας το δούμε αυτό στην πράξη επικαλώντας την εντολή μας με μια παράμετρο „San Diego, CA“ και χωρίς την παράμετρο.

$ ./weather.sh "San Diego, CA"
Tue 53-67°F Clear ~ Rain: 0%
Wed 54-67°F Mostly Cloudy ~ Rain: 0%
Thu 52-75°F Sunny ~ Rain: 0%
Fri 53-70°F Sunny ~ Rain: 0%
Sat 58-65°F Partly Sunny ~ Rain: 80% (Bring umbrella!)
$
$ ./weather.sh
Usage: weather11.sh location [degreeType]
Example: weather11.sh "San Diego, CA" F
$

Το σενάριό μας είναι πλέον ολοκληρωμένο και έτοιμο για χρήση παραγωγής. 🙂

Θα μπορούσατε, για παράδειγμα, να προσθέσετε την ακόλουθη γραμμή στη δική σας .profile αρχείο για να εκτελείτε το σενάριο καιρού κάθε φορά που συνδέεστε στο σύστημά σας από το ssh:

~/scripts/weather.sh "San Diego, CA"

Λάβετε υπόψη ότι αυτό θα σας παρέχει μια πρόγνωση καιρού κάθε φορά που συνδέεστε μέσω ssh, αλλά δεν θα εμφανίζεται κατά την εκκίνηση περιόδων σύνδεσης τερματικού μέσω του περιβάλλοντος επιφάνειας εργασίας Linux.

συμπέρασμα

Ποιος θα πίστευε ότι είχαμε τόση δύναμη να καταναλώνουμε δεδομένα JSON Web API από τη γραμμή εντολών bash με τη βοήθεια τόσο του curl όσο και του jq; Υπάρχουν πολλά ακόμη χαρακτηριστικά του jq που δεν είχαμε καν χρόνο να καλύψουμε. Μπορείτε να δείτε ένα επόμενο άρθρο που έγραψα με το όνομα Using jq and curl to Wrangle JSON Arrays from the Terminal και επίσης το Εγχειρίδιο jq για να μάθετε για πολλά από τα άλλα χαρακτηριστικά του jq. Θα επιστρέψουμε ξανά την επόμενη φορά για περισσότερη διασκεδαστική κατανάλωση δεδομένων JSON Web API!

Ακολουθήστε το @thisDaveJ (Dave Johnson) στο Twitter για να μείνετε ενημερωμένοι με τα πιο πρόσφατα σεμινάρια και άρθρα τεχνολογίας.

Πρόσθετα άρθρα

Δημιουργία Node.js Microservices με ευκολία χρησιμοποιώντας το Stdlib
Κατανάλωση Node.js Microservices Created with Stdlib
Node.js: Αποστολή ειδοποιήσεων email με χρήση του Nodemailer και του Gmail
Ξεκινώντας με το YAML στο Node.js χρησιμοποιώντας το js-yaml

Schreibe einen Kommentar