Το σφάλμα ανάλυσης JSON και πώς να το διορθώσετε
Τα περισσότερα σφάλματα ανάλυσης JSON προέρχονται από μια σύντομη λίστα λαθών: ένα κόμμα στο τέλος, μια συμβολοσειρά σε μονά εισαγωγικά, ένα σχόλιο, ένα κλειδί χωρίς εισαγωγικά, μια τιμή όπως NaN ή undefined, ή καμπύλα εισαγωγικά που αντιγράφηκαν από ένα έγγραφο. Το JSON είναι πιο αυστηρό από την JavaScript που του μοιάζει, οπότε κώδικας που φαίνεται σωστός σε εσάς μπορεί να απορριφθεί από έναν αναλυτή. Το μήνυμα σφάλματος δείχνει μια γραμμή και μια στήλη, και η διόρθωση βρίσκεται συνήθως σε εκείνο το σημείο ή αμέσως πριν από αυτό.
Μορφοποίηση JSONΤο JSON δεν διαβάζεταιΚάντε το δωρεάνΟι κανόνες που επιβάλλει το JSON
Ένα έγγραφο JSON είναι μία τιμή: ένα αντικείμενο σε άγκιστρα, ένας πίνακας σε αγκύλες, μια συμβολοσειρά, ένας αριθμός, true, false ή null. Μέσα σε αυτές τις τιμές:
- Κάθε κλειδί και κάθε συμβολοσειρά χρησιμοποιεί ίσια διπλά εισαγωγικά, όπως "name".
- Τα κόμματα χωρίζουν τα στοιχεία, και δεν πρέπει να υπάρχει κόμμα μετά το τελευταίο στοιχείο ενός αντικειμένου ή πίνακα.
- Οι αριθμοί δεν μπορούν να έχουν πρόσημο συν στην αρχή, και τα NaN, Infinity και undefined δεν είναι έγκυροι αριθμοί ή τιμές.
- Τα σχόλια δεν επιτρέπονται καθόλου.
- Τα κλειδιά πρέπει να είναι συμβολοσειρές, οπότε ένα κλειδί χωρίς εισαγωγικά όπως το name: δεν είναι έγκυρο.
Ορισμένοι αναλυτές δέχονται μερικούς από αυτούς τους κανόνες εξ ορισμού, και ορισμένα εργαλεία δέχονται JSON με σχόλια για ευκολία. Αυτή η ανοχή κρύβει το πρόβλημα μέχρι το αρχείο να φτάσει σε έναν πιο αυστηρό αναγνώστη, γι' αυτό γράψτε τη αυστηρή μορφή.
Ανάγνωση του μηνύματος σφάλματος
Οι αναλυτές αναφέρουν το πρώτο σημείο όπου δεν μπορούσαν να συνεχίσουν. Το μήνυμα ονομάζει το πρόβλημα και δίνει θέση, συνήθως γραμμή και στήλη. Ακολουθεί ένα μικρό αρχείο με κόμμα στο τέλος ενός πίνακα και άλλο ένα μετά την τελευταία ιδιότητα:
{
"name": "Ada",
"tags": ["a", "b",],
}
Η Python αναφέρει αυτό ως "Illegal trailing comma before end of array: line 3 column 20". Η διατύπωση διαφέρει ανάμεσα στα εργαλεία, και ορισμένοι παλαιότεροι αναλυτές γράφουν μόνο "Unexpected token" με μετατόπιση χαρακτήρα. Πηγαίνετε στη θέση που αναφέρεται και κοιτάξτε τον χαρακτήρα αμέσως πριν από αυτήν. Το πραγματικό λάθος είναι συχνά ένα κόμμα, εισαγωγικό ή άγκιστρο έναν ή δύο χαρακτήρες νωρίτερα από το σημείο που αναφέρεται.
Μερικά ακόμη μηνύματα από τον αναλυτή της Python και τι σημαίνουν συνήθως:
- Το "Expecting property name enclosed in double quotes" για το '{'a': 1}' σημαίνει κλειδί σε μονά εισαγωγικά ή χωρίς εισαγωγικά.
- Το "Expecting value" σε θέση όπου περιμένατε αριθμό ή συμβολοσειρά συχνά σημαίνει έξυπνο εισαγωγικό, επειδή ο αναλυτής το βλέπει ως άγνωστο χαρακτήρα.
- Το "Expecting ',' delimiter" σημαίνει συνήθως ότι λείπει κόμμα ανάμεσα σε δύο στοιχεία, ή ότι υπάρχει σχόλιο στη μέση των δεδομένων.
Έξυπνα εισαγωγικά και αντιγραμμένο κείμενο
Τα έξυπνα εισαγωγικά είναι η πιο μπερδεμένη περίπτωση, επειδή μοιάζουν σχεδόν ίδια με τα ίσια. Ένα αρχείο JSON που αντιγράφηκε από επεξεργαστή κειμένου, ιστοσελίδα ή μήνυμα συνομιλίας μπορεί να περιέχει καμπύλα διπλά εισαγωγικά. Το αρχείο σας φαίνεται σωστό και δεν αναλύεται, επειδή ο αναλυτής βλέπει το “x” ως άγνωστο χαρακτήρα και όχι ως οριοθέτη συμβολοσειράς.
Οι αόρατοι χαρακτήρες προκαλούν το ίδιο είδος αποτυχίας. Ένα μη θραυόμενο κενό ανάμεσα σε δύο τιμές δεν θεωρείται κενό διάστημα από τον αναλυτή. Αφαιρέστε τους αόρατους χαρακτήρες πριν επιχειρήσετε να διορθώσετε τη δομή με το χέρι, και μετά διορθώστε τα εισαγωγικά. Ο οδηγός για τα καμπύλα εισαγωγικά εξηγεί πώς να τα ισιώσετε με ασφάλεια.
Μονά εισαγωγικά, σχόλια και κλειδιά χωρίς εισαγωγικά
Πολλοί προγραμματιστές γράφουν δεδομένα τύπου JSON σε γλώσσα που επιτρέπει περισσότερα:
- Τα μονά εισαγωγικά είναι έγκυρα σε literals της JavaScript και της Python, αλλά το JSON απαιτεί διπλά εισαγωγικά. Αντικαταστήστε το {'a': 1} με {"a": 1}.
- Τα σχόλια όπως τα
//ή/* */πρέπει να αφαιρεθούν. Αν χρειάζεστε σημειώσεις, βάλτε τες σε ξεχωριστό πεδίο ή χρησιμοποιήστε μορφή σχεδιασμένη για αρχεία ρυθμίσεων. - Τα κλειδιά χωρίς εισαγωγικά είναι συνηθισμένα σε αντικείμενα της JavaScript. Προσθέστε τα εισαγωγικά.
- Τα NaN και undefined δεν είναι JSON. Χρησιμοποιήστε null για μια τιμή που λείπει, ή συμβολοσειρά αν η τιμή είναι κείμενο.
Προσέξτε με μια γενική αντικατάσταση. Αν αλλάξετε κάθε μονό εισαγωγικό σε διπλό, θα χαλάσετε κάθε συμβολοσειρά που περιέχει απόστροφο, όπως το "Ada's notes". Δείτε πρώτα κάθε αντιστοιχία στην εύρεση και αντικατάσταση, ώστε να βλέπετε ποια εισαγωγικά θα αλλάξουν.
Διορθώστε τη δομή βήμα βήμα
- Επικολλήστε το αρχείο στη μορφοποίηση JSON. Η μορφοποίηση κάνει τη δομή ορατή, και το σφάλμα δείχνει τη γραμμή και τη στήλη του. Μετά πατήστε Repair, που αφαιρεί σχόλια και κόμματα στο τέλος. Δεν αλλάζει μονά ή καμπύλα εισαγωγικά, οπότε αυτά τα διορθώνετε εσείς.
- Διορθώστε μόνο το πρώτο σφάλμα και ελέγξτε ξανά. Ένα λάθος μπορεί να παράγει αρκετά σφάλματα πιο κάτω.
- Ελέγξτε ότι κάθε άγκιστρο ή αγκύλη που ανοίγει έχει αντίστοιχο κλείσιμο, και ότι η φωλιασιά είναι αυτή που θέλετε.
- Επικυρώστε το τελικό αρχείο με τον αναλυτή που χρησιμοποιεί η εφαρμογή σας, και όχι μόνο με ένα εργαλείο στον ιστό. Οι αναλυτές διαφέρουν λίγο μεταξύ τους.
Ένα αρχείο που αναλύεται δεν είναι απαραίτητα αυτό που θέλατε. Ελέγξτε το με ένα JSON Schema για να εντοπίσετε ένα πεδίο που λείπει ή τιμή λάθος τύπου, ή συγκρίνετε δύο έγγραφα JSON για να δείτε τι άλλαξε ανάμεσα σε δύο εκδόσεις.
Ειδικές περιπτώσεις
- Κόμματα στο τέλος σε αρχεία που παράγονται αυτόματα. Ορισμένα εργαλεία τα γράφουν. Αν φτιάχνετε JSON με το χέρι συνενώνοντας συμβολοσειρές, χρησιμοποιήστε τον σειριοποιητή της γλώσσας σας, που γράφει έγκυρη έξοδο.
- Διπλά κλειδιά. Το JSON τα επιτρέπει, αλλά οι περισσότεροι αναλυτές κρατούν μόνο την τελευταία τιμή. Τα διπλά κλειδιά είναι σφάλμα που περιμένει να συμβεί.
- Μεγάλοι αριθμοί. Πολύ μεγάλοι ακέραιοι μπορεί να χάσουν ακρίβεια σε ορισμένους αναλυτές, οπότε αποθηκεύστε αναγνωριστικά ως συμβολοσειρές αν είναι μεγαλύτερα από όσα ο αναλυτής μπορεί να αναπαραστήσει ακριβώς. Ο οδηγός για το CSV σε JSON κάνει την ίδια επισήμανση για τα ID.
Γρήγορες απαντήσεις
Γιατί το JSON μου αποτυγχάνει ενώ φαίνεται σωστό;
Τα συνηθισμένα αίτια είναι κόμμα στο τέλος, μονά εισαγωγικά, σχόλιο ή καμπύλα εισαγωγικά αντιγραμμένα από ένα έγγραφο. Ελέγξτε τη θέση στο μήνυμα σφάλματος και τον χαρακτήρα αμέσως πριν από αυτήν.
Μπορεί το JSON να έχει σχόλια;
Όχι. Το πρότυπο JSON δεν επιτρέπει σχόλια. Αφαιρέστε τα, ή μεταφέρετε τις σημειώσεις σε ξεχωριστό πεδίο. Το κουμπί Repair του εργαλείου μορφοποίησης τα αφαιρεί για εσάς.
Τι να χρησιμοποιήσω στη θέση του undefined στο JSON;
Χρησιμοποιήστε null όταν μια τιμή λείπει σκόπιμα, ή παραλείψτε το κλειδί εντελώς. Το undefined είναι τιμή της JavaScript και δεν έχει αναπαράσταση σε JSON.
Μετάφραση από το Αγγλικό πρωτότυπο με τη βοήθεια τεχνητής νοημοσύνης.
Σχόλια
Δεν υπάρχουν σχόλια ακόμη. Γίνετε οι πρώτοι.


