Τι είναι το JSON;
Το JSON είναι μια τυπική μορφή ανταλλαγής δεδομένων, η οποία εμπνέεται από τη JavaScript. Γενικά, το JSON είναι σε μορφή συμβολοσειράς ή κειμένου. Το JSON σημαίνει J ava S cript O bject N otation.
Η σύνταξη του JSON: JSON γράφεται ως ζεύγος κλειδιών και τιμών.
{"Key": "Value","Key": "Value",}
Το JSON μοιάζει πολύ με το λεξικό Python. Η Python υποστηρίζει JSON και διαθέτει μια ενσωματωμένη βιβλιοθήκη ως JSON.
Βιβλιοθήκη JSON στο Python
Οι εξωτερικές μονάδες « marshal » και « pickle» του Python διατηρούν μια έκδοση της βιβλιοθήκης JSON . Για να εκτελέσετε λειτουργίες που σχετίζονται με το JSON, όπως κωδικοποίηση και αποκωδικοποίηση στο Python, πρέπει πρώτα να εισαγάγετε τη βιβλιοθήκη JSON και για αυτό στο αρχείο .py ,
import json
Οι ακόλουθες μέθοδοι είναι διαθέσιμες στη μονάδα JSON
Μέθοδος | Περιγραφή |
---|---|
κατήφεια() | κωδικοποίηση σε αντικείμενα JSON |
εγκαταλείπω() | κωδικοποιημένη συμβολοσειρά που γράφεται στο αρχείο |
φορτία () | Αποκωδικοποιήστε τη συμβολοσειρά JSON |
φορτώνω() | Αποκωδικοποίηση κατά την ανάγνωση του αρχείου JSON |
Python to JSON (κωδικοποίηση)
Η JSON Library of Python εκτελεί την μετάφραση των αντικειμένων Python σε αντικείμενα JSON από προεπιλογή
Πύθων | JSON |
υπαγορεύω | Αντικείμενο |
λίστα | Πίνακας |
unicode | Σειρά |
number - int, μεγάλο | αριθμός - int |
φλοτέρ | αριθμός - πραγματικός |
Αληθής | Αληθής |
Ψευδής | Ψευδής |
Κανένας | Μηδενικό |
Η μετατροπή δεδομένων Python σε JSON ονομάζεται λειτουργία κωδικοποίησης. Η κωδικοποίηση γίνεται με τη βοήθεια της μεθόδου βιβλιοθήκης JSON - dumps ()
Η μέθοδος dumps () μετατρέπει το αντικείμενο λεξικού του python σε μορφή δεδομένων συμβολοσειράς JSON.
Τώρα ας κάνουμε το πρώτο μας παράδειγμα κωδικοποίησης με το Python.
import jsonx = {"name": "Ken","age": 45,"married": True,"children": ("Alice","Bob"),"pets": ['Dog'],"cars": [{"model": "Audi A1", "mpg": 15.1},{"model": "Zeep Compass", "mpg": 18.1}]}# sorting result in asscending order by keys:sorted_string = json.dumps(x, indent=4, sort_keys=True)print(sorted_string)
Παραγωγή:
{"person": {"name": "Kenn", "sex": "male", "age": 28}})
Ας δημιουργήσουμε ένα αρχείο JSON του λεξικού χρησιμοποιώντας την ίδια λειτουργία dump ()
# here we create new data_file.json file with write mode using file i/o operationwith open('json_file.json', "w") as file_write:# write json data into filejson.dump(person_data, file_write)
Παραγωγή:
Τίποτα για εμφάνιση
… Στο σύστημά σας δημιουργείται json_file.json μπορείτε να ελέγξετε αυτό το αρχείο.JSON προς Python (αποκωδικοποίηση)
Η αποκωδικοποίηση συμβολοσειράς JSON γίνεται με τη βοήθεια ενσωματωμένων φορτίων μεθόδου () & φόρτωσης () της βιβλιοθήκης JSON στο Python. Εδώ ο πίνακας μετάφρασης δείχνει παράδειγμα αντικειμένων JSON σε αντικείμενα Python που είναι χρήσιμα για την εκτέλεση αποκωδικοποίησης στη συμβολοσειρά Python of JSON.
JSON | Πύθων |
Αντικείμενο | υπαγορεύω |
Πίνακας | λίστα |
Σειρά | unicode |
αριθμός - int | number - int, μεγάλο |
αριθμός - πραγματικός | φλοτέρ |
Αληθής | Αληθής |
Ψευδής | Ψευδής |
Μηδενικό | Κανένας |
Ας δούμε ένα βασικό παράδειγμα αποκωδικοποίησης στο Python με τη βοήθεια της συνάρτησης json.loads () ,
import json # json library imported# json data stringperson_data = '{ "person": { "name": "Kenn", "sex": "male", "age": 28}}'# Decoding or converting JSON format in dictionary using loads()dict_obj = json.loads(person_data)print(dict_obj)# check type of dict_objprint("Type of dict_obj", type(dict_obj))# get human object detailsprint("Person… ", dict_obj.get('person'))
Παραγωγή:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}Type of dict_objPerson… {'name': 'John', 'sex': 'male'}
Αποκωδικοποίηση αρχείου JSON ή ανάλυσης αρχείου JSON στο Python
ΣΗΜΕΙΩΣΗ: Η αποκωδικοποίηση του αρχείου JSON είναι λειτουργία που σχετίζεται με την είσοδο / έξοδο αρχείου (I / O). Το αρχείο JSON πρέπει να υπάρχει στο σύστημά σας στην καθορισμένη θέση που αναφέρετε στο πρόγραμμά σας.
Παράδειγμα,
import json#File I/O Open function for read data from JSON Filewith open('X:/json_file.json') as file_object:# store file data in objectdata = json.load(file_object)print(data)
Εδώ τα δεδομένα είναι ένα λεξικό αντικείμενο της Python.
Παραγωγή:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Συμπαγής κωδικοποίηση στο Python
Όταν πρέπει να μειώσετε το μέγεθος του αρχείου JSON, μπορείτε να χρησιμοποιήσετε συμπαγή κωδικοποίηση στο Python.
Παράδειγμα,
import json# Create a List that contains dictionarylst = ['a', 'b', 'c',{'4': 5, '6': 7}]# separator used for compact representation of JSON.# Use of ',' to identify list items# Use of ':' to identify key and value in dictionarycompact_obj = json.dumps(lst, separators=(',', ':'))print(compact_obj)
Παραγωγή:
'["a", "b", "c", {"4": 5, "6": 7}]'** Here output of JSON is represented in a single line which is the most compact representation by removing the space character from compact_obj **
Μορφοποίηση κώδικα JSON (Όμορφη εκτύπωση)
- Ο στόχος είναι να γράψετε καλά μορφοποιημένο κώδικα για ανθρώπινη κατανόηση. Με τη βοήθεια της όμορφης εκτύπωσης, ο καθένας μπορεί εύκολα να κατανοήσει τον κώδικα.
- Παράδειγμα,
import jsondic = { 'a': 4, 'b': 5 }''' To format the code use of indent and 4 shows number of space and use of separator is not necessary but standard way to write code of particular function. '''formatted_obj = json.dumps(dic, indent=4, separators=(',', ': '))print(formatted_obj)
Παραγωγή:
{"a" : 4,"b" : 5}
Για να το κατανοήσετε καλύτερα, αλλάξτε την εσοχή σε 40 και παρατηρήστε την έξοδο-
Παραγγελία του κωδικού JSON:
Το χαρακτηριστικό sort_keys σε dumps () το όρισμα της συνάρτησης θα ταξινομήσει το κλειδί στο JSON σε αύξουσα σειρά. Το όρισμα sort_keys είναι ένα χαρακτηριστικό Boolean. Όταν είναι αληθινή ταξινόμηση επιτρέπεται διαφορετικά όχι
Παράδειγμα,
import jsonx = {"name": "Ken","age": 45,"married": True,"children": ("Alice", "Bob"),"pets": [ 'Dog' ],"cars": [{"model": "Audi A1", "mpg": 15.1},{"model": "Zeep Compass", "mpg": 18.1}],}# sorting result in asscending order by keys:sorted_string = json.dumps(x, indent=4, sort_keys=True)print(sorted_string)
Παραγωγή:
{"age": 45,"cars": [ {"model": "Audi A1","mpg": 15.1},{"model": "Zeep Compass","mpg": 18.1}],"children": [ "Alice","Bob"],"married": true,"name": "Ken","pets": ["Dog"]}
Όπως μπορείτε να παρατηρήσετε την ηλικία των κλειδιών, τα αυτοκίνητα, τα παιδιά κ.λπ. τακτοποιούνται σε αύξουσα σειρά.
Σύνθετη κωδικοποίηση αντικειμένων της Python
Ένα σύνθετο αντικείμενο έχει δύο διαφορετικά μέρη που είναι
- Πραγματικό μέρος
- Φανταστικό μέρος
Παράδειγμα: 3 + 2i
Πριν από την εκτέλεση κωδικοποίησης ενός σύνθετου αντικειμένου, πρέπει να ελέγξετε ότι μια μεταβλητή είναι περίπλοκη ή όχι. Πρέπει να δημιουργήσετε μια συνάρτηση που ελέγχει την τιμή που είναι αποθηκευμένη σε μια μεταβλητή χρησιμοποιώντας μια μέθοδο παρουσίας.
Ας δημιουργήσουμε τη συγκεκριμένη λειτουργία για το αντικείμενο ελέγχου είναι πολύπλοκο ή κατάλληλο για κωδικοποίηση.
import json# create function to check instance is complex or notdef complex_encode(object):# check using isinstance methodif isinstance(object, complex):return [object.real, object.imag]# raised error using exception handling if object is not complexraise TypeError(repr(object) + " is not JSON serialized")# perform json encoding by passing parametercomplex_obj = json.dumps(4 + 5j, default=complex_encode)print(complex_obj)
Παραγωγή:
'[4.0, 5.0]'
Συγκρότημα αποκωδικοποίησης αντικειμένου JSON στην Python
Για να αποκωδικοποιήσετε σύνθετο αντικείμενο στο JSON, χρησιμοποιήστε μια παράμετρο object_hook που ελέγχει ότι η συμβολοσειρά JSON περιέχει το σύνθετο αντικείμενο ή όχι. Παράδειγμα,
import json# function check JSON string contains complex objectdef is_complex(objct):if '__complex__' in objct:return complex(objct['real'], objct['img'])return objct# use of json loads method with object_hook for check object complex or notcomplex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)#here we not passed complex object so it's convert into dictionarysimple_object =json.loads('{"real": 6, "img": 7}', object_hook = is_complex)print("Complex_object… ",complex_object)print("Without_complex_object… ",simple_object)
Παραγωγή:
Complex_object… (4+5j)Without_complex_object… {'real': 6, 'img': 7}
Επισκόπηση του JSON Serialization class JSONEncoder
Η κλάση JSONEncoder χρησιμοποιείται για σειριοποίηση οποιουδήποτε αντικειμένου Python κατά την εκτέλεση κωδικοποίησης. Περιέχει τρεις διαφορετικές μεθόδους κωδικοποίησης που είναι
- προεπιλογή (o) - Εφαρμόζεται στην υποκατηγορία και επιστρέφει σειριακό αντικείμενο για αντικείμενο o .
- encode (o) - Όπως και η μέθοδος json.dumps () επιστρέφει τη συμβολοσειρά JSON της δομής δεδομένων Python.
- iterencode (o) - Αντιπροσωπεύστε τη συμβολοσειρά μία προς μία και κωδικοποιήστε το αντικείμενο o.
Με τη βοήθεια της μεθόδου encode () της κλάσης JSONEncoder, μπορούμε επίσης να κωδικοποιήσουμε οποιοδήποτε αντικείμενο Python.
# import JSONEncoder class from jsonfrom json.encoder import JSONEncodercolour_dict = { "colour": ["red", "yellow", "green" ]}# directly called encode method of JSONJSONEncoder().encode(colour_dict)
Παραγωγή:
'{"colour": ["red", "yellow", "green"]}'
Επισκόπηση του JSON Deserialization class JSONDecoder
Η κλάση JSONDecoder χρησιμοποιείται για την αποεστερίωση οποιουδήποτε αντικειμένου Python κατά την εκτέλεση αποκωδικοποίησης. Περιέχει τρεις διαφορετικές μεθόδους αποκωδικοποίησης που είναι
- προεπιλογή (o) - Εφαρμόσθηκε στην υποκατηγορία και επιστροφής αποσειριοποιημένου αντικειμένου o αντικειμένου.
- αποκωδικοποίηση (o) - Όπως και η μέθοδος json.loads () επιστρέφει τη δομή δεδομένων Python της συμβολοσειράς JSON ή των δεδομένων.
- raw_decode (o) - Αντιπροσωπεύστε ένα λεξικό Python ένα προς ένα και αποκωδικοποιήστε το αντικείμενο o.
Με τη βοήθεια της μεθόδου αποκωδικοποίησης () της κλάσης JSONDecoder, μπορούμε επίσης να αποκωδικοποιήσουμε τη συμβολοσειρά JSON.
import json# import JSONDecoder class from jsonfrom json.decoder import JSONDecodercolour_string = '{ "colour": ["red", "yellow"]}'# directly called decode method of JSONJSONDecoder().decode(colour_string)
Παραγωγή:
{'colour': ['red', 'yellow']}
Αποκωδικοποίηση δεδομένων JSON από URL: Παράδειγμα πραγματικής ζωής
Θα λάβουμε δεδομένα του CityBike NYC (Bike Sharing System) από καθορισμένη διεύθυνση URL (https://feeds.citibikenyc.com/stations/stations.json) και θα μετατρέψουμε σε μορφή λεξικού.
Παράδειγμα,
ΣΗΜΕΙΩΣΗ: - Βεβαιωθείτε ότι η βιβλιοθήκη αιτημάτων είναι ήδη εγκατεστημένη στο Python σας
- (Για Python 3 ή παραπάνω) αιτήματα εγκατάστασης pip3
import jsonimport requests# get JSON string data from CityBike NYC using web requests libraryjson_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json")# check type of json_response objectprint(type(json_response.text))# load data in loads() function of json librarybike_dict = json.loads(json_response.text)#check type of news_dictprint(type(bike_dict))# now get stationBeanList key data from dictprint(bike_dict['stationBeanList'][0])
Παραγωγή:
{'id': 487,'stationName': 'E 20 St & FDR Drive','availableDocks': 24,'totalDocks': 34,'latitude': 40.73314259,'longitude': -73.97573881,'statusValue': 'In Service','statusKey': 1,'availableBikes': 9,'stAddress1': 'E 20 St & FDR Drive','stAddress2': '','city': '','postalCode': '','location': '','altitude': '','testStation': False,'lastCommunicationTime': '2018-12-11 10:59:09 PM', 'landMark': ''}
Εξαιρέσεις που σχετίζονται με τη βιβλιοθήκη JSON στο Python:
- Η κλάση json.JSONDecoderError χειρίζεται την εξαίρεση που σχετίζεται με τη λειτουργία αποκωδικοποίησης. και είναι μια υποκατηγορία του ValueError.
- Εξαίρεση - json.JSONDecoderError (msg, doc)
- Οι παράμετροι της εξαίρεσης είναι,
- msg - Μη μορφοποιημένο μήνυμα σφάλματος
- doc - Τα έγγραφα JSON αναλύθηκαν
- pos - start ευρετήριο του εγγράφου όταν είναι αποτυχημένο
- lineno - line no show αντιστοιχούν στη θέση
- άνω και κάτω τελεία - η στήλη δεν αντιστοιχεί στη θέση
Παράδειγμα,
import json#File I/O Open function for read data from JSON Filedata = {} #Define Empty Dictionary Objecttry:with open('json_file_name.json') as file_object:data = json.load(file_object)except ValueError:print("Bad JSON file format, Change JSON File")
Άπειροι και αριθμοί NaN στην Python
Η μορφή ανταλλαγής δεδομένων JSON (RFC - Αίτημα για σχόλια) δεν επιτρέπει την τιμή Infinite ή Nan αλλά δεν υπάρχει περιορισμός στη βιβλιοθήκη Python-JSON να εκτελεί λειτουργία που σχετίζεται με την Infinite και την τιμή Nan. Εάν το JSON λαμβάνει τον τύπο δεδομένων INFINITE και Nan από αυτό το μετατρέπει σε κυριολεκτικό.
Παράδειγμα,
import json# pass float Infinite valueinfinite_json = json.dumps(float('inf'))# check infinite json typeprint(infinite_json)print(type(infinite_json))json_nan = json.dumps(float('nan'))print(json_nan)# pass json_string as Infinityinfinite = json.loads('Infinity')print(infinite)# check type of Infinityprint(type(infinite))
Παραγωγή:
InfinityNaNinf
Επαναλαμβανόμενο πλήκτρο στο JSON String
Το RFC καθορίζει ότι το όνομα κλειδιού πρέπει να είναι μοναδικό σε ένα αντικείμενο JSON, αλλά δεν είναι υποχρεωτικό. Η βιβλιοθήκη Python JSON δεν δημιουργεί εξαίρεση από επαναλαμβανόμενα αντικείμενα στο JSON. Αγνοεί όλα τα επαναλαμβανόμενα ζεύγη κλειδιού-τιμής και λαμβάνει υπόψη μόνο το τελευταίο ζεύγος κλειδιού-τιμής.
- Παράδειγμα,
import jsonrepeat_pair = '{"a": 1, "a": 2, "a": 3}'json.loads(repeat_pair)
Παραγωγή:
{'a': 3}
CLI (Command Line Interface) με JSON στο Python
Το json.tool παρέχει τη διεπαφή γραμμής εντολών για την επικύρωση της σύνταξης εκτυπώσεων JSON. Ας δούμε ένα παράδειγμα CLI
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
Παραγωγή:
{"name": " Kings Authur "}
Πλεονεκτήματα του JSON στην Python
- Εύκολη μετακίνηση μεταξύ εμπορευματοκιβωτίων και αξίας (JSON σε Python και Python σε JSON)
- Αντικείμενο αναγνώσιμο από τον άνθρωπο (Pretty-print)
- Χρησιμοποιείται ευρέως στη διαχείριση δεδομένων.
- Δεν έχει την ίδια δομή δεδομένων στο μεμονωμένο αρχείο.
Περιορισμός εφαρμογής του JSON στην Python
- Σε αποστειρωτή JSON εύρος και πρόβλεψη ενός αριθμού
- Το μέγιστο μήκος της συμβολοσειράς JSON και των συστοιχιών του JSON και των επιπέδων ένθεσης του αντικειμένου.
Κωδικός εξαπάτησης
json.dumps (πρόσωπο_δεδομένων) |
Δημιουργία αντικειμένου JSON |
json.dump (person_data, file_write) |
Δημιουργήστε το αρχείο JSON χρησιμοποιώντας το αρχείο I / O του Python |
compact_obj = json.dumps (δεδομένα, διαχωριστικά = (',', ':')) |
Συμπαγές αντικείμενο JSON αφαιρώντας διαστημικό χαρακτήρα από το αντικείμενο JSON χρησιμοποιώντας διαχωριστικό |
formatted_obj = json.dumps (dic, indent = 4, διαχωριστικά = (',', ':')) |
Μορφοποίηση κώδικα JSON χρησιμοποιώντας εσοχή |
sorted_string = json.dumps (x, εσοχή = 4, sort_keys = True) |
Ταξινόμηση κλειδιού αντικειμένου JSON με αλφαβητική σειρά |
complex_obj = json.dumps (4 + 5j, προεπιλογή = complex_encode) |
Κωδικοποίηση αντικειμένου Python Complex στο JSON |
Κωδικοποίηση JSONEncoder (). (Colour_dict) |
Χρήση της κλάσης JSONEncoder για σειριοποίηση |
json.loads (συμβολοσειρά_ δεδομένων) |
Αποκωδικοποίηση JSON String στο λεξικό Python χρησιμοποιώντας τη συνάρτηση json.loads () |
json.loads ('{"__ complex__": true, "real": 4, "img": 5}', object_hook = is_complex) |
Αποκωδικοποίηση σύνθετου αντικειμένου JSON στο Python |
JSONDecoder (). Αποκωδικοποίηση (χρωματική σειρά) |
Χρήση της αποκωδικοποίησης JSON σε Python με αποεστεροποίηση |