Εισαγωγή είναι μια απλή μορφή ανταλλαγής δεδομένων. πριν από σχεδόν 15 χρόνια, γράψαμε για , η οποία εισήγαγε τη δυνατότητα να serialize και deserialize τύπους Go σε και από δεδομένα JSON. Από τότε, JSON έχει γίνει η πιο δημοφιλής μορφή δεδομένων που χρησιμοποιείται στο Διαδίκτυο. Είναι ευρέως διαβάζεται και γράφεται από τα προγράμματα Go, και κωδικοποίηση /json τώρα κατατάσσεται ως το 5ο πιο εισαγόμενο πακέτο Go. Εγγραφή αντικειμένων JavaScript (JSON) support for JSON in Go Με την πάροδο του χρόνου, τα πακέτα εξελίσσονται με τις ανάγκες των χρηστών τους και Αυτό το blog post είναι για το νέο πειραματικό Go 1.25 και Αυτό το άρθρο υποστηρίζει μια νέα μεγάλη έκδοση API, παρέχει μια επισκόπηση των νέων πακέτων και εξηγεί πώς μπορείτε να το χρησιμοποιήσετε. τα πειραματικά πακέτα δεν είναι ορατά από προεπιλογή και μπορεί να υποστούν μελλοντικές αλλαγές API. encoding/json encoding/json/v2 encoding/json/jsontext Προβλήματα με encoding/json Κωδικοποίηση / JSON Συνολικά όμως, Η ιδέα του marshaling και του unmarshaling των αυθαίρετων τύπων Go με κάποια προεπιλεγμένη αναπαράσταση στο JSON, σε συνδυασμό με την ικανότητα προσαρμογής της αναπαράστασης, έχει αποδειχθεί εξαιρετικά ευέλικτη. encoding/json Λάθη συμπεριφοράς Υπάρχουν διάφορα λάθη στη συμπεριφορά : encoding/json : Over the years, JSON has seen increased standardization in order for programs to properly communicate. Generally, decoders have become stricter at rejecting ambiguous inputs, to reduce the chance that two implementations will have different (successful) interpretations of a particular JSON value. Imprecise handling of JSON syntax currently accepts invalid UTF-8, whereas the latest Internet Standard (RFC 8259) requires valid UTF-8. The default behavior should report an error in the presence of invalid UTF-8, instead of introducing silent data corruption, which may cause problems downstream. encoding/json currently accepts objects with duplicate member names. RFC 8259 does not specify how to handle duplicate names, so an implementation is free to choose an arbitrary value, merge the values, discard the values, or report an error. The presence of a duplicate name results in a JSON value without a universally agreed upon meaning. This could be and has been exploited before (as in ). The default behavior should err on the side of safety and reject duplicate names. encoding/json exploited by attackers in security applications CVE-2017-12635 Διαρροή της μηδενικότητας των τεμαχίων και των χαρτών: Το JSON χρησιμοποιείται συχνά για την επικοινωνία με προγράμματα που χρησιμοποιούν εφαρμογές JSON που δεν επιτρέπουν το μηδενικό να μηδενιστεί σε έναν τύπο δεδομένων που αναμένεται να είναι μια σειρά JSON ή ένα αντικείμενο. Δεδομένου ότι η κωδικοποίηση/json περιέχει ένα μηδενισμένο τεμαχίο ή χάρτη ως μηδενισμένο JSON, αυτό μπορεί να οδηγήσει σε σφάλματα κατά την αποσυναρμολόγηση από άλλες εφαρμογές. Μια έρευνα έδειξε ότι οι περισσότεροι χρήστες του Go προτιμούν να περιέχουν μηδενισμένες τεμαχίες και χάρτες ως κενό μήκος ή αντικείμενο από προεπιλογή. Case-insensitive unmarshaling: Όταν unmarshaling, ένα όνομα μέλους αντικειμένου JSON επιλύεται σε ένα όνομα πεδίου Go struct χρησιμοποιώντας ένα case-insensitive match. Μη συνεπής κλήση μεθόδων: Λόγω μιας λεπτομέρειας εφαρμογής, οι μέθοδοι MarshalJSON που δηλώνονται σε έναν δέκτη δείκτη καλούνται ασυνεπώς από την κωδικοποίηση/json. Ενώ θεωρείται ως σφάλμα, αυτό δεν μπορεί να διορθωθεί καθώς πάρα πολλές εφαρμογές εξαρτώνται από την τρέχουσα συμπεριφορά. Ελλείψεις πυρκαγιάς Η φωτιά του can be tricky or restrictive: encoding/json Οι χρήστες συχνά γράφουν json.NewDecoder(r).Decode(v), το οποίο δεν απορρίπτει το σκουπίδι παρακολούθησης στο τέλος της εισόδου. Options can be set on the and types, but cannot be used with the and functions. Similarly, types implementing the and interfaces cannot make use of the options and there is no way to plumb options down the call stack. For example, the option loses its effect when calling a custom method. Encoder Decoder Marshal Unmarshal Marshaler Unmarshaler Decoder.DisallowUnknownFields UnmarshalJSON Οι λειτουργίες Compact, Indent και HTMLEscape γράφουν σε bytes.Buffer αντί για κάτι πιο ευέλικτο όπως ένα []byte ή io.Writer. Αυτό περιορίζει τη χρηστικότητα αυτών των λειτουργιών. Performance limitations Απορρίπτοντας τις εσωτερικές λεπτομέρειες εφαρμογής, το δημόσιο API δεσμεύεται για ορισμένους περιορισμούς απόδοσης: : The interface method forces the implementation to allocate the returned . Also, the semantics require that verify that the result is valid JSON and also to reformat it to match the specified indentation. MarshalJSON MarshalJSON []byte encoding/json : The interface method requires that a complete JSON value be provided (without any trailing data). This forces to parse the JSON value to be unmarshaled in its entirety to determine where it ends before it can call . Afterwards, the method itself must parse the provided JSON value again. UnmarshalJSON UnmarshalJSON encoding/json UnmarshalJSON UnmarshalJSON : Even though the and types operate on an or , they buffer the entire JSON value in memory. The method for reading individual tokens is allocation-heavy and there is no corresponding API for writing tokens. Lack of streaming Encoder Decoder io.Writer io.Reader Decoder.Token Επιπλέον, εάν η εφαρμογή ενός ή Η επαναλαμβανόμενη μέθοδος ονομάζεται ή Το αποτέλεσμα είναι τετράγωνο και η απόδοση γίνεται τετράγωνη. MarshalJSON UnmarshalJSON Marshal Unmarshal Προσπαθώντας να διορθώσετε άμεσα encoding/json Κωδικοποίηση / JSON Η εισαγωγή μιας νέας, ασυμβίβαστης μεγάλης έκδοσης ενός πακέτου είναι μια βαριά εξέταση.Εάν είναι δυνατόν, θα πρέπει να προσπαθήσουμε να διορθώσουμε το υπάρχον πακέτο. While it is relatively easy to add new features, it is difficult to change existing features. Unfortunately, these problems are inherent consequences of the existing API, making them practically impossible to fix within the . Go 1 compatibility promise Θα μπορούσαμε, κατ’ αρχήν, να δηλώσουμε ξεχωριστά ονόματα, όπως ή , but that is tantamount to creating a parallel namespace within the same package. This leads us to (henceforth called ) όπου μπορούμε να κάνουμε αυτές τις αλλαγές μέσα σε ξεχωριστό Η ονομαστική αντίθεση με την (από εδώ και στο εξής) ) της MarshalV2 UnmarshalV2 encoding/json/v2 v2 v2 encoding/json v1 Planning for Κωδικοποίηση / JSON / V2 Κωδικοποίηση / JSON / V2 Ο σχεδιασμός μιας νέας μεγάλης έκδοσης του Στα τέλη του 2020, ενθουσιασμένος από την αδυναμία επίλυσης προβλημάτων στο τρέχον πακέτο, ο Daniel Martí (ένας από τους συντηρητές του Πρώτα έγραψε τις σκέψεις του για το πακέτο θα πρέπει να μοιάζει. ξεχωριστά, μετά από προηγούμενη εργασία στο Ο Τζο Τσάι ήταν απογοητευμένος. Το πακέτο χρειάζεται για να χρησιμοποιήσετε μια προσαρμοσμένη υλοποίηση JSON επειδή δεν ήταν σε θέση ούτε να συμμορφωθεί με το αυστηρότερο πρότυπο JSON που απαιτείται από την προδιαγραφή του Πρωτοκόλλου Buffer, ούτε να σειριοποιήσει αποτελεσματικά το JSON με τρόπο ροής. encoding/json encoding/json what a hypothetical v2 Go API για το πρωτόκολλο Buffers Η protojson encoding/json Πιστεύοντας ότι ένα λαμπρότερο μέλλον για το JSON ήταν τόσο επωφελές όσο και εφικτό, ο Daniel και ο Joe ενώνουν τις δυνάμεις τους για να κάνουν brainstorming. και (με τον αρχικό κώδικα να είναι μια γυαλισμένη έκδοση της λογικής σειριοποίησης JSON από τη μονάδα protobuf Go). Με την πάροδο του χρόνου, μερικοί άλλοι (Roger Peppe, Chris Hines, Johan Brandhorst-Satzkorn, και Damien Neil) εντάχθηκαν στην προσπάθεια παρέχοντας ανασκόπηση σχεδιασμού, ανασκόπηση κώδικα και δοκιμές αναδρομής. and . v2 Ξεκίνησε η κατασκευή ενός πρωτότυπου Καταγεγραμμένες συναντήσεις Σημειώσεις συνάντησης Αυτό το έργο είναι δημόσιο από την αρχή, και συμμετέχουμε όλο και περισσότερο στην ευρύτερη κοινότητα Go, πρώτα με μια και , Και πιο πρόσφατα ως πείραμα Go (διαθέσιμο στο Go 1.25) για ευρύτερη δοκιμή από όλους τους χρήστες Go. Μιλάει ο Γκόφερ Συζήτηση που δημοσιεύτηκε στα τέλη του 2023 επίσημη πρόταση που υποβλήθηκε στις αρχές του 2025 υιοθετώντας encoding/json/v2 Η Η προσπάθεια συνεχίζεται εδώ και 5 χρόνια, ενσωματώνοντας ανατροφοδότηση από πολλούς συνεισφέροντες και αποκτώντας επίσης πολύτιμη εμπειρική εμπειρία από τη χρήση σε περιβάλλοντα παραγωγής. v2 Αξίζει να σημειωθεί ότι έχει αναπτυχθεί και προωθηθεί σε μεγάλο βαθμό από άτομα που δεν απασχολούνται από την Google, αποδεικνύοντας ότι το έργο Go είναι μια συνεργατική προσπάθεια με μια ακμάζουσα παγκόσμια κοινότητα αφιερωμένη στη βελτίωση του οικοσυστήματος Go. Το κτίριο είναι encoding/json/jsontext Κωδικοποίηση / JSON / JSON Πριν συζητήσουμε το Πρώτα από όλα, εισάγουμε την πειραματική πακέτο που θέτει τα θεμέλια για μελλοντικές βελτιώσεις στο JSON στο Go. v2 encoding/json/jsontext Η σειριοποίηση JSON στο Go μπορεί να χωριστεί σε δύο κύρια συστατικά: συντακτική λειτουργικότητα που ασχολείται με την επεξεργασία του JSON με βάση τη γραμματική του και η σημασιολογική λειτουργικότητα που καθορίζει τη σχέση μεταξύ των τιμών JSON και των τιμών Go. Χρησιμοποιούμε τους όρους «κωδικοποίηση» και «αποκωδικοποίηση» για να περιγράψουμε τη συνθετική λειτουργικότητα και τους όρους «μάρσαλ» και «μη-μάρσαλ» για να περιγράψουμε τη σημασιολογική λειτουργικότητα. Αυτό το διάγραμμα παρέχει μια επισκόπηση αυτού του διαχωρισμού. Τα μοβ μπλοκ αντιπροσωπεύουν τύπους, ενώ τα μπλε μπλοκ αντιπροσωπεύουν λειτουργίες ή μεθόδους. Η κατεύθυνση των βέλων αντιπροσωπεύει κατά προσέγγιση τη ροή των δεδομένων. πακέτο, περιέχει λειτουργικότητα που αφορά μόνο τη σύνταξη, ενώ το άνω μισό, που εφαρμόζεται από την package, contains functionality that assigns semantic meaning to syntactic data handled by the bottom half. jsontext json/v2 Η βασική πυρκαγιά του Είναι το εξής: jsontext package jsontext type Encoder struct { ... } func NewEncoder(io.Writer, ...Options) *Encoder func (*Encoder) WriteValue(Value) error func (*Encoder) WriteToken(Token) error type Decoder struct { ... } func NewDecoder(io.Reader, ...Options) *Decoder func (*Decoder) ReadValue() (Value, error) func (*Decoder) ReadToken() (Token, error) type Kind byte type Value []byte func (Value) Kind() Kind type Token struct { ... } func (Token) Kind() Kind Η Το πακέτο παρέχει λειτουργικότητα για την αλληλεπίδραση με το JSON σε συνθετικό επίπεδο και προέρχεται από το όνομα του όπου η γραμματική για τα δεδομένα JSON ονομάζεται κυριολεκτικά Δεδομένου ότι αλληλεπιδρά μόνο με το JSON σε συντακτικό επίπεδο, δεν εξαρτάται από την αντανάκλαση Go. jsontext RFC 8259, τμήμα 2 JSON-text Η και παρέχουν υποστήριξη για την κωδικοποίηση και την αποκωδικοποίηση των τιμών JSON και των tokens. που επηρεάζουν τη συγκεκριμένη συμπεριφορά της κωδικοποίησης και της αποκωδικοποίησης. σε αντίθεση με την και Τύποι που αναφέρονται στην , the new types in avoid muddling the distinction between syntax and semantics and operate in a truly streaming manner. Encoder Decoder Αποδοχή των εναλλακτικών επιλογών Encoder Decoder v1 jsontext Μια τιμή JSON είναι μια πλήρης μονάδα δεδομένων και αντιπροσωπεύεται στο Go ως Είναι πανομοιότυπο με στην . A JSON value is syntactically composed of one or more JSON tokens. A JSON token is represented in Go as the με τους κατασκευαστές και τις μεθόδους πρόσβασης. είναι παρόμοια με στην αλλά έχει σχεδιαστεί για να αντιπροσωπεύει αυθαίρετα tokens JSON χωρίς κατανομή. Η ονομασία []byte RawMessage v1 Αδιαφάνεια Token Token v1 Για την επίλυση των θεμελιωδών προβλημάτων απόδοσης με την και μεθόδους διεπαφής, χρειαζόμαστε έναν αποτελεσματικό τρόπο κωδικοποίησης και αποκωδικοποίησης του JSON ως ακολουθία ροής των tokens και των τιμών. Εμείς εισάγουμε το και μεθόδους που λειτουργούν σε ένα ή , επιτρέποντας στις εφαρμογές των μεθόδων να επεξεργάζονται το JSON με καθαρό τρόπο ροής. MarshalJSON UnmarshalJSON v2 MarshalJSONTo UnmarshalJSONFrom Encoder Decoder Thus, the Το πακέτο δεν χρειάζεται να είναι υπεύθυνο για την επικύρωση ή τη μορφοποίηση μιας τιμής JSON που επιστρέφεται από , ούτε θα χρειαστεί να είναι υπεύθυνη για τον προσδιορισμό των ορίων μιας τιμής JSON που παρέχεται . These responsibilities belong to the and . json MarshalJSON UnmarshalJSON Encoder Decoder Εισαγωγή encoding/json/v2 Κωδικοποίηση / JSON / V2 Η κατασκευή στο Το πακέτο, τώρα εισάγουμε το πειραματικό Έχει σχεδιαστεί για να διορθώσει τα προαναφερθέντα προβλήματα, ενώ παραμένει εξοικειωμένος με τους χρήστες του Στόχος μας είναι η χρήση των will operate Ακόμη και αν μεταναστεύσουν άμεσα σε . jsontext encoding/json/v2 v1 v1 mostly v2 Σε αυτό το άρθρο, θα καλύψουμε κυρίως το υψηλού επιπέδου API του Για παραδείγματα για το πώς να το χρησιμοποιήσετε, ενθαρρύνουμε τους αναγνώστες να μελετήσουν package or read . v2 Τα παραδείγματα στην v2 Το blog του Anton Zhiyanov που καλύπτει το θέμα Η βασική πυρκαγιά του is the following: v2 package json func Marshal(in any, opts ...Options) (out []byte, err error) func MarshalWrite(out io.Writer, in any, opts ...Options) error func MarshalEncode(out *jsontext.Encoder, in any, opts ...Options) error func Unmarshal(in []byte, out any, opts ...Options) error func UnmarshalRead(in io.Reader, out any, opts ...Options) error func UnmarshalDecode(in *jsontext.Decoder, out any, opts ...Options) error The και functions have a signature similar to , αλλά αποδέχονται επιλογές για να διαμορφώσουν τη συμπεριφορά τους. και functions directly operate on an ή , avoiding the need to temporarily construct an or just to write or read from such types. Marshal Unmarshal v1 MarshalWrite UnmarshalRead io.Writer io.Reader Encoder Decoder Η και Οι λειτουργίες λειτουργούν σε and και είναι στην πραγματικότητα η υποκείμενη εφαρμογή των προαναφερθέντων λειτουργιών. , options are a first-class argument to each of the marshal and unmarshal functions, greatly extending the flexibility and configurability of Υπάρχουν in που δεν καλύπτονται από το παρόν άρθρο. MarshalEncode UnmarshalDecode jsontext.Encoder jsontext.Decoder v1 v2 Διάφορες διαθέσιμες επιλογές v2 Προσαρμοσμένη προσαρμογή τύπου Παρόμοια , allows types to define their own JSON representation by satisfying particular interfaces. v1 v2 type Marshaler interface { MarshalJSON() ([]byte, error) } type MarshalerTo interface { MarshalJSONTo(*jsontext.Encoder) error } type Unmarshaler interface { UnmarshalJSON([]byte) error } type UnmarshalerFrom interface { UnmarshalJSONFrom(*jsontext.Decoder) error } Η και interfaces are identical to those in . The new και επιτρέπουν σε έναν τύπο να αντιπροσωπεύει τον εαυτό του ως JSON χρησιμοποιώντας ένα ή . This allows options to be forwarded down the call stack, since options can be retrieved via the accessor method on the ή . Marshaler Unmarshaler v1 MarshalerTo UnmarshalerFrom jsontext.Encoder jsontext.Decoder Options Encoder Decoder See example for how to implement a custom type that maintains the ordering of JSON object members. Η OrderedObject Caller-specified customization στην , the caller of and can also specify a custom JSON representation for any arbitrary type, where caller-specified functions take precedence over type-defined methods or the default representation for a particular type. v2 Marshal Unmarshal func WithMarshalers(*Marshalers) Options type Marshalers struct { ... } func MarshalFunc[T any](fn func(T) ([]byte, error)) *Marshalers func MarshalToFunc[T any](fn func(*jsontext.Encoder, T) error) *Marshalers func WithUnmarshalers(*Unmarshalers) Options type Unmarshalers struct { ... } func UnmarshalFunc[T any](fn func([]byte, T) error) *Unmarshalers func UnmarshalFromFunc[T any](fn func(*jsontext.Decoder, T) error) *Unmarshalers και construct a custom marshaler that can be passed to a call using to override the marshaling of particular types. Similarly, and Παρόμοια προσαρμογή για . MarshalFunc MarshalToFunc Marshal WithMarshalers UnmarshalFunc UnmarshalFromFunc Unmarshal example demonstrates how this feature allows serialization of all types to be handled by the Το πακέτο. Η ProtoJSON proto.Message protojson Διαφορές συμπεριφοράς Ενώ Στόχος η συμπεριφορά Το ίδιο όπως Η συμπεριφορά της έχει αλλάξει Για την αντιμετώπιση των προβλημάτων στην Και κυρίως: v2 Κυρίως v1 Με κάποιο τρόπο v1 reports an error in the presence of invalid UTF-8. v2 reports an error if a JSON object contains a duplicate name. v2 marshals a nil Go slice or Go map as an empty JSON array or JSON object, respectively. v2 unmarshals a JSON object into a Go struct using a case-sensitive match from the JSON member name to the Go field name. v2 redefines the tag option to omit a field if it would have encoded as an “empty” JSON value (which are , , , and ). v2 omitempty null "" [] {} reports an error when trying to serialize a , which currently has , but provides options to let the caller decide. v2 time.Duration no default representation Για τις περισσότερες αλλαγές συμπεριφοράς, υπάρχει μια επιλογή ετικέτας struct ή επιλογή που καθορίζεται από τον καλούντα που μπορεί να ρυθμίσει τη συμπεριφορά για να λειτουργεί κάτω από ή ραδιοφώνου, ή ακόμα και άλλου είδους ραδιοφώνου. δείτε Για περισσότερες πληροφορίες. v1 v2 «Μετανάστευση στο V2» Performance optimizations The Η απόδοση του Είναι σχεδόν σε ισοτιμία με Μερικές φορές είναι ελαφρώς ταχύτερη, αλλά άλλες φορές είναι ελαφρώς πιο αργή. performance of Είναι σημαντικά ταχύτερη από , with benchmarks demonstrating improvements of up to 10x. Marshal v2 v1 Unmarshal v2 v1 Για την επίτευξη μεγαλύτερων επιδόσεων, οι υφιστάμενες εφαρμογές and Πρέπει να μεταναστεύσουμε για να εφαρμόσουμε and , έτσι ώστε να μπορούν να επωφεληθούν από την επεξεργασία του JSON με καθαρό τρόπο ροής. μεθόδους που υποβαθμίζουν σημαντικά την απόδοση σε μια συγκεκριμένη υπηρεσία του Kubernetes (βλ. ), while switching to improved performance by orders of magnitude. Marshaler Unmarshaler MarshalerTo UnmarshalerFrom UnmarshalJSON kubernetes/kube-openapi#315 UnmarshalJSONFrom Για περισσότερες πληροφορίες, δείτε το του αποθετηρίου. go-json-experiment/jsonbench Retroactively improving encoding/json Κωδικοποίηση / JSON Θέλουμε να αποφύγουμε δύο ξεχωριστές εφαρμογές JSON στη τυπική βιβλιοθήκη Go, οπότε είναι κρίσιμο ότι, κάτω από το καπάκι, is implemented in terms of . v1 v2 Υπάρχουν πολλά πλεονεκτήματα αυτής της προσέγγισης: Σταδιακή μετανάστευση: Οι λειτουργίες Marshal και Unmarshal στο v1 ή v2 αντιπροσωπεύουν ένα σύνολο προεπιλεγμένων συμπεριφορών που λειτουργούν σύμφωνα με τη σημασιολογία v1 ή v2. Μπορούν να καθοριστούν επιλογές που διαμορφώνουν το Marshal ή το Unmarshal για να λειτουργούν με εντελώς v1, κυρίως v1 με κάποια v2, ένα μείγμα v1 ή v2, κυρίως v2 με κάποια v1, ή εντελώς v2 σημασιολογία. Αυτό επιτρέπει σταδιακή μετανάστευση μεταξύ των προεπιλεγμένων συμπεριφορών των δύο εκδόσεων. Κληρονομιά χαρακτηριστικών: Καθώς προστίθενται χαρακτηριστικά συμβατά προς τα πίσω στο v2, θα είναι εγγενώς διαθέσιμα στο v1. Για παράδειγμα, το v2 προσθέτει υποστήριξη για αρκετές νέες επιλογές ετικετών δομής, όπως inline ή μορφή και επίσης υποστήριξη για τις μεθόδους διεπαφής MarshalJSONTo και UnmarshalJSONFrom, οι οποίες είναι τόσο πιο επιτυχημένες όσο και πιο ευέλικτες. : Maintenance of a widely used package demands significant effort. By having and use the same implementation, the maintenance burden is reduced. In general, a single change will fix bugs, improve performance, or add functionality to both versions. There is no need to backport a change with an equivalent change. Reduced maintenance v1 v2 v2 v1 Επιλέγοντας κομμάτια από μπορεί να υποχωρήσει με την πάροδο του χρόνου (υποθέτοντας αποφοίτων από το να είναι ένα πείραμα), το πακέτο στο σύνολό του δεν θα εξαφανιστεί ποτέ. θα ενθαρρυνθεί, αλλά δεν απαιτείται. το έργο Go δεν θα χάσει την υποστήριξη για . v1 v2 v2 v1 Πειραματισμός με jsonv2 jsonv2 Η νέα πυρκαγιά στο and Τα πακέτα δεν είναι ορατά από προεπιλογή.Για να τα χρησιμοποιήσετε, δημιουργήστε τον κωδικό σας με στο δικό σας περιβάλλον ή με την Η φύση ενός πειράματος είναι ότι το API είναι ασταθές και μπορεί να αλλάξει στο μέλλον. Παρόλο που το API είναι ασταθές, η εφαρμογή είναι υψηλής ποιότητας και έχει χρησιμοποιηθεί με επιτυχία στην παραγωγή από αρκετά μεγάλα έργα. encoding/json/jsontext encoding/json/v2 GOEXPERIMENT=jsonv2 goexperiment.jsonv2 Το γεγονός ότι Εφαρμόζεται σε ό,τι αφορά Αυτό σημαίνει ότι η υποκείμενη εφαρμογή του Είναι εντελώς διαφορετικό όταν χτίζεται κάτω από το experiment. Without changing any code, you should be able to run your tests under and theoretically nothing new should fail: v1 v2 v1 jsonv2 jsonv2 GOEXPERIMENT=jsonv2 go test ./... Η επανεφαρμογή του in terms of επιδιώκει να παράσχει πανομοιότυπη συμπεριφορά εντός των ορίων της , αν και ορισμένες διαφορές μπορεί να παρατηρηθούν, όπως η ακριβής διατύπωση των μηνυμάτων σφάλματος. σας ενθαρρύνουμε να εκτελέσετε τις δοκιμές σας κάτω από Ενημερωθείτε για οποιαδήποτε επιστροφή . v1 v2 Go 1 compatibility promise jsonv2 Σχετικά με το Tracker Το να γίνετε ένα πείραμα στο Go 1.25 είναι ένα σημαντικό ορόσημο στο δρόμο για την επίσημη υιοθέτηση και της βιβλιοθήκης, αλλά ο σκοπός της Η ανατροφοδότησή σας θα καθορίσει τα επόμενα βήματα μας και το αποτέλεσμα αυτού του πειράματος, το οποίο μπορεί να οδηγήσει σε οτιδήποτε από την εγκατάλειψη της προσπάθειας, στην υιοθέτηση ως σταθερά πακέτα του Go 1.26. Βοηθήστε μας να καθορίσουμε το μέλλον του. encoding/json/jsontext encoding/json/v2 jsonv2 go.dev/πρόβλημα 71497 Joe Tsai, Daniel Martí, Johan Brandhorst-Satzkorn, Roger Peppe, Chris Hines και Damien Neil This article is available on under a CC BY 4.0 DEED license. Το blog του Go Το blog του Go The Go Blog Φωτογραφία: JR Korpa στο Unsplash ΤΖΡ ΚΟΡΠΑ Μυστηριώδης