Αρχιτεκτονικός διαχωρισμός: jsontext vs json/v2

Η θεμελιώδης αλλαγή στο Go 1.27 είναι ο διαχωρισμός της συντακτικής ανάλυσης (syntactic functionality) από τη σημασιολογική (semantic functionality). Το νέο πακέτο encoding/json/jsontext αναλαμβάνει αποκλειστικά τη διαχείριση της γραμματικής του JSON, λειτουργώντας ως ένα streaming API που δεν βασίζεται σε reflection. Αντίθετα, το encoding/json/v2 χτίζει πάνω σε αυτό, αναλαμβάνοντας την αντιστοίχιση των δεδομένων σε τύπους της Go.

Επίλυση χρόνιων προβλημάτων και ασφάλεια

Το αρχικό encoding/json (v1) παρουσίαζε αδυναμίες που δεν μπορούσαν να διορθωθούν λόγω της δέσμευσης για συμβατότητα (Go 1 compatibility promise). Το v2 εισάγει αυστηρότερους ελέγχους:

  • Ασφάλεια: Απόρριψη διπλότυπων κλειδιών σε αντικείμενα JSON για την αποφυγή επιθέσεων τύπου CVE.
  • Συνέπεια: Αυστηρή επικύρωση UTF-8 και case-sensitive αντιστοίχιση πεδίων, εξαλείφοντας απρόβλεπτες συμπεριφορές.
  • Nil handling: Αλλαγή στη συμπεριφορά των nil slices και maps, τα οποία πλέον αποδίδονται ως κενά arrays ή objects αντί για null.

Streaming και απόδοση

Τα νέα interfaces MarshalerTo και UnmarshalerFrom επιτρέπουν την επεξεργασία δεδομένων μέσω Encoder και Decoder χωρίς την ανάγκη ενδιάμεσης αποθήκευσης ολόκληρου του JSON στη μνήμη (buffer). Αυτή η προσέγγιση μειώνει δραστικά το memory footprint και επιτρέπει την επεξεργασία μεγάλων payloads με σταθερή απόδοση, λύνοντας το πρόβλημα των quadratic επιδόσεων σε αναδρομικές δομές.

Στρατηγική μετάβασης και συμβατότητα

Η ομάδα της Go σχεδίασε το v2 ώστε να είναι συμβατό με το v1. Το v1 υλοποιείται πλέον εσωτερικά μέσω του v2, χρησιμοποιώντας συγκεκριμένα options για να προσομοιώσει την παλαιότερη συμπεριφορά. Αυτό επιτρέπει στους developers να μεταφέρουν τμήματα του κώδικά τους στο v2 σταδιακά, επιλέγοντας ποιες συμπεριφορές θέλουν να εκσυγχρονίσουν και ποιες να διατηρήσουν για λόγους backward compatibility.