Σύγκριση δύο δομών JSON
- Πίνακας ελέγχου
- Τεκμηρίωση
- API
Γιατί να συγκρίνουμε δύο JSON;
Η σύγκριση δύο δομών JSON εμφανίζεται τακτικά στη ζωή ενός προγραμματιστή. Μια απάντηση API που αλλάζει μετά από ενημέρωση. Ένα αρχείο διαμόρφωσης που αποκλίνει μεταξύ δύο περιβαλλόντων. Α εξαγωγή αντικειμένων που πρέπει να ευθυγραμμιστούν με μια αναφορά. Μια διαφορά JSON ανταποκρίνεται με ακρίβεια αυτή η ερώτηση: τι προστέθηκε, διαγράφηκε ή τροποποιήθηκε και πού;
Μια γραμμή προς γραμμή διαφορ (a la git diff) συχνά δεν αρκεί. Εάν η μορφοποίηση
διαφέρει (κενά, σειρά πλήκτρων), η διαφορά κειμένου αναφέρει εκατοντάδες γραμμές ενώ η δομή
τα δεδομένα είναι πανομοιότυπα. Ένας συγκριτής JSON λειτουργεί στη δομή αφού αναλυθεί, κάτι που το εξαλείφει
θόρυβο και αποκαλύπτει μόνο σημασιολογικές διαφορές.
Η μορφή της διαφοράς που παράγεται από το εργαλείο
Για κάθε απόκλιση, το εργαλείο επιστρέφει:
- μια διαδρομή σε απλοποιημένη μορφή JSONPath, για παράδειγμα
$.user.address[0].city; - ένας τύπος μεταξύ προστέθηκε (προστέθηκε στα δεξιά), καταργήθηκε (παρουσιάστηκε στα αριστερά μόνο), τροποποιημένο (διαφορετικές τιμές);
- την αριστερή τιμή ή/και τη δεξιά τιμή ανάλογα με τον τύπο.
Μια κενή διαφορά σημαίνει ότι τα δύο JSON είναι δομικά πανομοιότυπα, ανεξάρτητα από το ποια είναι μορφοποίηση ή σειρά κλειδιών.
Πώς ο αλγόριθμος διασχίζει τις δύο δομές
Ο αλγόριθμος είναι αναδρομικός. Σε κάθε επίπεδο, προσδιορίζει τον τύπο των δύο τιμών που συγκρίνονται:
- Εάν και τα δύο είναι συσχετιστικά αντικείμενα, απαιτείται η ένωση των κλειδιών. Για κάθε κλειδί, κατεβαίνει αναδρομικά ή επισημαίνει προστέθηκε/αφαιρέθηκε εάν το κλειδί υπάρχει μόνο στη μία πλευρά.
- Εάν και οι δύο είναι διατεταγμένοι πίνακες, συγκρίνει θέση προς θέση. Α Η διαφορά στην αρχή του πίνακα μπορεί να μετατοπίσει οτιδήποτε άλλο, κάτι που δημιουργεί μια βαρετή διαφορά: είναι α υποτιθέμενο όριο της αφελούς δομικής διαφοράς.
- Εάν οι τύποι διαφέρουν (αντικείμενο έναντι πίνακα, βαθμωτό έναντι μηδενός), επισημαίνεται τροποποιήθηκε.
- Εάν και οι δύο τιμές είναι κλιμακωτές (συμβολοσειρά, αριθμός, boolean, null), μια απλή αρκεί η αυστηρή σύγκριση.
Η σειρά των κλειδιών σε ένα αντικείμενο δεν έχει σημασία: {"a": 1, "b": 2} και {"b": 2, "a": 1}
παράγουν ένα κενό διαφορ. Αυτό συμμορφώνεται με τη σημασιολογία JSON, όπου η σειρά δεν έχει νόημα. Σε
Ωστόσο, η σειρά των στοιχείων ενός πίνακα έχει σημασία: ένας πίνακας ταξινομείται κατά κατασκευή.
Ένα συγκεκριμένο παράδειγμα
Ακολουθούν δύο εκδόσεις ενός αντικειμένου χρήστη:
// αριστερά
{
"id": 42,
"όνομα": "Αλίκη",
"ρόλοι": ["διαχειριστής", "συντάκτης"]
}
// δεξιά
{
"id": 42,
"όνομα": "Alice Martin",
"ρόλοι": ["διαχειριστής", "θεατής"],
«ενεργός»: αληθινός
}
Η διαφορά παράγει:
$.name: τροποποιήθηκε,"Alice"→"Alice Martin"$.roles[1]: τροποποιήθηκε,"editor"→"viewer"$.active: προστέθηκε,true
Θήκες χρήσης
- Διαφορετικά περιβάλλοντα: συγκρίνετε την έξοδο ενός τελικού σημείου στην προπαραγωγή και στην παραγωγής. Πολύ χρήσιμο κατά τη μετεγκατάσταση ή την ανανέωση της προσωρινής μνήμης.
- Έλεγχος μετεγκατάστασης: συγκρίνετε μια εξαγωγή πριν και μετά τη μετατροπή για έλεγχο ότι κανένα πεδίο δεν έχει χαθεί.
- Αντιστροφή API: πριν και μετά από μια αλλαγή, συγκρίνετε την απόκριση για α πανομοιότυπο ερώτημα. Μια κενή διαφορά επιβεβαιώνει τη μη παλινδρόμηση.
- Συγχρονισμός διαμόρφωσης: συγκρίνετε το
composer.jsonμεταξύ δύο υποκαταστήματα, δύο αρχεία.eslintrc, δύο διαμορφώσεις Symfony. - Δοκιμές στιγμιότυπου: αντικαταστήστε μια σύγκριση γραμμής σε γραμμή με σύγκριση δομικό σε μια σουίτα δοκιμών ενοποίησης.
Όρια δομικής διαφοράς
Η σύγκριση διατεταγμένων πινάκων είναι ένας γνωστός περιορισμός των απλών δομικών διαφορών. Αν εισάγουμε α στοιχείο στην αρχή του πίνακα, όλες οι επόμενες θέσεις μετατοπίζονται και το diff σηματοδοτεί κάθε απόκλιση ως τροποποίηση. Για τέτοιες περιπτώσεις, υπάρχουν πιο προηγμένοι αλγόριθμοι (Myers, Patience, διαφέρουν κατά φυσικό κλειδί), αλλά υπερβαίνουν το πεδίο εφαρμογής ενός γενικού εργαλείου σύγκρισης.
Η διαφορά επίσης δεν λέει γιατί έγινε μια αλλαγή: είναι μια παρατήρηση. Να αναλύσει α παλινδρόμηση, αυτή η παρατήρηση πρέπει να διασταυρωθεί με τις δεσμεύσεις, τις αναπτύξεις και τις παραμέτρους του ερώτηση.
JSON diff vs JSON Patch (RFC 6902)
Μια συμπληρωματική μορφή είναι Ενημερωμένη έκδοση κώδικα JSON (RFC 6902). Περιγράφει, με τη μορφή πράξεων
(προσθήκη, αφαίρεση, αντικατάσταση, μετακίνηση, αντιγραφή,
test), πώς να μετατρέψετε ένα έγγραφο JSON σε άλλο. Όπου η διαφορά μας είναι μια παρατήρηση
(άνθρωπος), το JSON Patch είναι μια συνταγή (μηχανή). Οι δύο αναπαραστάσεις είναι ισοδύναμες για
απλές περιπτώσεις και το JSON Patch είναι χρήσιμο για RESTful API που δέχονται τροποποιήσεις
μερική.
Συχνές ερωτήσεις
Η διαφορά εξαρτάται από τη σειρά των κλειδιών;
Όχι: για ένα αντικείμενο JSON, η σειρά δεν είναι σημαντική. Ο συγκριτής παράγει το ίδιο αποτέλεσμα με τα κλειδιά είναι ταξινομημένα ή όχι.
Πώς να χειρίζεστε πίνακες των οποίων η σειρά δεν είναι σημαντική;
Το εργαλείο θεωρεί τους πίνακες ως ταξινομημένους από προεπιλογή (αυτή είναι η σημασιολογία JSON). Εάν θεραπεύσετε ορίζει, ταξινομεί τους δύο πίνακες με ένα φυσικό κλειδί πριν από τη σύγκριση ή χρησιμοποιεί μια υπηρεσία εξειδικευμένο εργαλείο σύγκρισης που λαμβάνει υπόψη αυτές τις σημασιολογίες.
Ποια είναι η διαφορά με τη διαφορά Git;
Το Git συγκρίνει γραμμές κειμένου. Εάν η εσοχή ή η σειρά των κλειδιών διαφέρει, η διαφορά Git είναι πολύ πολυλεκτικός. Η διαφορά JSON λειτουργεί στην αναλυμένη δομή και αναφέρει μόνο κενά δεδομένων.
Είναι αποδεκτό το μη έγκυρο JSON;
Όχι: εάν ένα από τα δύο JSON δεν αναλύει, το εργαλείο επιστρέφει ένα σφάλμα. Επικυρώστε πρώτα με το δικό μας Επικυρωτής JSON.
Παράδειγμα αιτήματος
curl -X POST https://cdrn.fr/api/v1/tools/json-diff/execute \
-H "Content-Type: application/json" \
-d '{"left":"...","right":"..."}'
Σχήμα εισόδου
| Πεδίο | Τύπος | Απαιτείται | Προεπιλογή |
|---|---|---|---|
left |
text | ✓ | – |
right |
text | ✓ | – |
Σημεία πρόσβασης
GET https://cdrn.fr/api/v1/tools- εμφανίζει όλα τα διαθέσιμα εργαλείαGET https://cdrn.fr/api/v1/tools/json-diff- ανακτά το σχήμα αυτού του εργαλείουPOST https://cdrn.fr/api/v1/tools/json-diff/execute- εκτελεί αυτό το εργαλείο με payload JSON