Το JSON (JavaScript Object Notation) είναι μια εξαιρετικά ευέλικτη και εξαιρετικά δημοφιλής μορφή δεδομένων. Χρησιμοποιείται συχνά για επικοινωνία μεταξύ εφαρμογών Ιστού και επίσης ως βολικός τρόπος αποθήκευσης μεγάλων ποσοτήτων δομημένων δεδομένων εφαρμογών.
Το JSON είναι τόσο χρήσιμο που σχεδόν όλες οι σύγχρονες γλώσσες προγραμματισμού παρέχουν ενσωματωμένη υποστήριξη για εργασία με αυτό, συμπεριλαμβανομένου του Go.
Εργασία με JSON στο Go
Μπορείτε να χωρίσετε το μεγαλύτερο μέρος της δουλειάς που θα κάνετε με το JSON σε δύο γενικές κατηγορίες: marshaling και unmarshaling. Βικιπαίδεια ορίζει το marshaling ως:
Στην επιστήμη των υπολογιστών, το marshaling είναι η διαδικασία μετατροπής της αναπαράστασης μνήμης ενός αντικειμένου σε μια μορφή δεδομένων κατάλληλη για αποθήκευση ή μετάδοση. Συνήθως χρησιμοποιείται όταν τα δεδομένα πρέπει να μετακινηθούν μεταξύ διαφορετικών τμημάτων ενός προγράμματος υπολογιστή ή από το ένα πρόγραμμα στο άλλο.
Με απλούστερους όρους, το marshaling είναι η διαδικασία μετατροπής δεδομένων που είναι αποθηκευμένα σε μια μεταβλητή σε μια φόρμα που είναι πιο εύκολο να περάσει σε άλλο πρόγραμμα. Η αποσύνδεση είναι η αντίστροφη διαδικασία: περιλαμβάνει τη λήψη δεδομένων μορφοποιημένων για μεταφορά και τη μετατροπή τους σε μια φόρμα που είναι πιο εύκολη στη χρήση από το πρόγραμμά σας.
Χρησιμοποιώντας το Go, μπορείτε να εντάξετε εγγενείς δομές δεδομένων σε JSON. Και μπορείτε να εκτελέσετε την αντίστροφη ενέργεια, αποσυναρμολογώντας τα δεδομένα JSON σε μεταβλητές Go.
Marshalling σε JSON στο Go
Πηγαίνετε παρέχει το πακέτο κωδικοποίησης/json για να σας διευκολύνει να εργάζεστε με JSON. Αυτό το πακέτο περιέχει πολλές λειτουργίες, αλλά αυτή που θα χρησιμοποιήσετε για μαρσάρισμα είναι η Διευθετώ λειτουργία. Διευθετώ έχει την ακόλουθη υπογραφή λειτουργίας:
Func Marshal (v διεπαφή{}) ([]byte, σφάλμα)
Αυτό σημαίνει ότι Διευθετώ δέχεται μια παράμετρο οποιουδήποτε τύπου δεδομένων και επιστρέφει δύο τιμές: ένα κομμάτι byte και ένα σφάλμα. Με άλλα λόγια, καλείτε Διευθετώ με μια τιμή Go, και τη μετατρέπει σε JSON και επιστρέφει το ισοδύναμο JSON. Εάν αντιμετωπίσει σφάλμα κατά τη διαδικασία μετατροπής, θα επιστρέψει το σφάλμα και ένα κενό κομμάτι.
Εδώ είναι ένα παράδειγμα κώδικα που χρησιμοποιεί Διευθετώ για να μετατρέψετε έναν χάρτη σε JSON. Για να εκτελέσετε αυτό το παράδειγμα, το μόνο που χρειάζεστε είναι να δημιουργήσετε ένα αρχείο Go τον αγαπημένο σας επεξεργαστή κώδικα, ή χρησιμοποιήστε το Πήγαινε παιδική χαρά:
πακέτο κύριος
εισαγωγή (
"κωδικοποίηση/json"
"fmt"
)func κύριος(){
val := χάρτης[string]ενθ{
"Γιάννης": 25,
"Μαρία": 19,
"Αδάμ": 5,
}
res, _ := json. Στρατάρχης (Βαλ)
fmt.Εκτύπωση(σειρά(res))
}
Εάν εκτελέσετε αυτόν τον κώδικα, θα παράγει τα εξής:
Όπως αναφέρθηκε προηγουμένως, μπορείτε να ομαδοποιήσετε οποιονδήποτε τύπο δεδομένων Go στο JSON, αν και στην πραγματική ζωή συνήθως θα κάνετε ομαδοποίηση δομών. Εξαιτίας αυτού, το Go παρέχει μια δυνατότητα που ονομάζεται struct tags για να σας επιτρέψει να δώσετε Διευθετώ επιπλέον οδηγίες για τη μετατροπή των δομών σας.
Μια ετικέτα struct είναι μια συμβολοσειρά που συμπεριλαμβάνετε στη δήλωση δομής δίπλα στον τύπο δεδομένων ενός πεδίου. Οι ετικέτες Struct σάς επιτρέπουν να προσαρμόσετε τον τρόπο Διευθετώ αντιμετωπίζει το πεδίο στο οποίο ανήκει η ετικέτα. Μπορείτε να χρησιμοποιήσετε ετικέτες struct για να μετονομάσετε ένα πεδίο στην έξοδο JSON ή ακόμα και να το παραλείψετε εντελώς. Struct tags (αυτό Διευθετώ αναγνωρίζει) ξεκινήστε με τη δευτερεύουσα συμβολοσειρά "json:".
Για παράδειγμα, πείτε ότι έχετε μια δομή Αυτοκίνητο που αντιπροσωπεύει κάποιες πληροφορίες για ένα αυτοκίνητο. Εδώ είναι ο κώδικας για τη δημιουργία ενός Αυτοκίνητο και κατευθυνθείτε στο JSON:
πακέτο κύριος
εισαγωγή (
"κωδικοποίηση/json"
"fmt"
)
func κύριος(){
τύπος Κατασκευή αυτοκινήτου {
Συμβολοσειρά μάρκας
Μοντέλο κορδόνι
Τιμή ενθ
}
val := Αυτοκίνητο{Μάρκα: "Mercedes", Μοντέλο: "Benz", Τιμή: 50000}
res, _ := json. Στρατάρχης (Βαλ)
fmt.Εκτύπωση(σειρά(res))
}
Αυτός ο κώδικας παράγει την έξοδο:
ο Μάρκα, Μοντέλο, και Τιμή πεδία του Αυτοκίνητο πρέπει να ξεκινήσετε με κεφαλαία γράμματα ή Διευθετώ δεν θα είναι σε θέση να τα μετατρέψει. Αυτό έχει ως αποτέλεσμα τα πεδία εξόδου JSON να ξεκινούν επίσης με κεφαλαία. Τι γίνεται όμως αν θέλετε τα ονόματα να ξεκινούν με πεζά στο JSON ή αν θέλετε να μετονομάσετε εξ ολοκλήρου ένα πεδίο; Εκεί μπαίνουν οι ετικέτες struct. Εδώ είναι ένα παράδειγμα:
πακέτο κύριος
εισαγωγή (
"κωδικοποίηση/json"
"fmt"
)
func κύριος(){
τύπος Κατασκευή αυτοκινήτου {
Αναγνωριστικό int `json:"-"`
Συμβολοσειρά επωνυμίας `json:"τύπος"`
Μοντέλο συμβολοσειράς `json:"μοντέλο"`
Τιμή int `json:"τιμή"`
}
val := Αυτοκίνητο{ID: 0, Μάρκα: "Mercedes", Μοντέλο: "Benz", Τιμή: 50000}
res, _ := json. Στρατάρχης (Βαλ)
fmt.Εκτύπωση(σειρά(res))
}
Αυτός ο κωδικός εισάγει ένα νέο πεδίο ID που Διευθετώ παραλείπει από την έξοδο JSON μέσω μιας ετικέτας struct. Ο κώδικας χρησιμοποιεί επίσης ετικέτες struct για να μετονομάσετε τα άλλα πεδία struct. Εδώ είναι η έξοδος του προγράμματος:
Όπως μπορείτε να δείτε, το τμήμα της ετικέτας struct που ακολουθεί το "json:" γίνεται το όνομα του πεδίου στην έξοδο του Marshal. Υπάρχει μια εξαίρεση: αν είναι η συμβολοσειρά "-", ο Marshal παραλείπει αυτό το πεδίο από την έξοδο. Μπορείτε να διαβάσετε περισσότερα για τις ετικέτες Marshal και struct στο Μεταβείτε τεκμηρίωση.
Unmarshalling From JSON in Go
Το πακέτο κωδικοποίησης/json παρέχει επίσης μια λειτουργία unmarshaling, που ονομάζεται Ανεξάρτητος. Έχει την ακόλουθη υπογραφή λειτουργίας:
func Unmarshal (δεδομένα []byte, v διεπαφή{}) λάθος
Διαφορετικός Διευθετώ, Ανεξάρτητος δεν επιστρέφει τιμή. Αντίθετα, δέχεται το JSON ως ένα κομμάτι byte στο πρώτο όρισμα και στη συνέχεια αποθηκεύει τα δεδομένα που έχουν μετατραπεί στο αντικείμενο στο οποίο επισημαίνεται το δεύτερο όρισμα. Ανεξάρτητος λειτουργεί και με ετικέτες struct, αλλά εδώ, οι ετικέτες λένε Ανεξάρτητος ποια πεδία JSON ταιριάζουν με ποια πεδία δομής.
Όταν αποσυναρμολογείτε σε ένα πρόγραμμα, ίσως ανάκτηση δεδομένων από ένα API, αλλά εδώ θα χρησιμοποιείτε εικονικά δεδομένα. Δείτε πώς χρησιμοποιείτε Ανεξάρτητος:
πακέτο κύριος
εισαγωγή (
"κωδικοποίηση/json"
"fmt"
)func κύριος(){
τύπος Κατασκευή αυτοκινήτου {
Αναγνωριστικό int `json:"-"`
Συμβολοσειρά επωνυμίας `json:"τύπος"`
Μοντέλο συμβολοσειράς `json:"μοντέλο"`
Τιμή int `json:"τιμή"`
}jsonInput := `{
"τύπος": "Toyota",
"μοντέλο": "Camry",
"τιμή": 2000
}`var jsonOutput Car
err := json. Unmarshal([]ψηφιόλεξη(jsonInput), &jsonOutput)αν λάθος != μηδέν {
fmt. Println("Σφάλμα αποκωδικοποίησης JSON!")
ΕΠΙΣΤΡΟΦΗ
}
fmt.Εκτύπωση(jsonOutput)
}
Αυτός ο κώδικας χρησιμοποιεί τον ίδιο τύπο αυτοκινήτου με το προηγούμενο παράδειγμα και αποσυνδέει ένα αντικείμενο JSON σε μια δομή τύπου Car και, στη συνέχεια, εκτυπώνει τα δεδομένα στη δομή. Όταν εκτελείται, το πρόγραμμα παράγει αυτήν την έξοδο:
Αυτό δείχνει ότι τα εικονικά δεδομένα JSON αποσυναρμολογήθηκαν με επιτυχία στο jsonOutput struct.
Το Go διευκολύνει την εργασία με το JSON
Με το πακέτο κωδικοποίησης/json, η εργασία με το JSON in Go είναι τόσο απλή όσο δύο κλήσεις συναρτήσεων: Marshaland Unmarshal. Το Go σάς επιτρέπει επίσης να προσαρμόσετε τη διαδικασία μαρσαλοποίησης/απομίχισης JSON με ετικέτες struct.
Η μετατροπή δεδομένων σε JSON είναι ένας πολύ καλός τρόπος για να τα μοιραστείτε με άλλο πρόγραμμα ή διαδικασία. Η μορφή είναι τόσο καθολική που το JSON είναι όσο το δυνατόν πιο φορητό.