2013-03-23 6 views
6

Ho due file JSON e vorrei ottenere un json contenente le differenze. È importante che solo le differenze effettive del contenuto di devono essere visualizzate, indipendentemente dall'ordine di alcuni elementi.Il modo migliore per restituire le differenze di due file json in modo programmatico

Quale sarebbe il modo migliore per farlo? Sto cercando una soluzione il più efficiente possibile, dal momento che gli json s possono contenere molti dati e gli utenti devono eseguire i lavori il più rapidamente possibile.

Nota: il numero json potrebbe contenere dati codificati a profondità diverse. Qualsiasi linguaggio di programmazione è ok, ma preferirei una risposta che potrebbe essere facilmente implementata in PHP.

+0

Non importa come lo guardi, credo che tu debba solo passare attraverso ogni singola chiave. A meno che non si possa fare affidamento su un qualche tipo di identificatore ma per tale motivo sarà necessario elaborare più – Alexander

+1

Ho risposto a una domanda simile qui: "[Matrici multidimensionali, differenza di controllo] [1]". La risposta potrebbe essere modificata per discendere in rami, se necessario chiamando in modo ricorsivo i metodi "get_keys" e "compare_records". [1]: http://stackoverflow.com/questions/15504734/multidimensional-arrays-check-difference/15504984#15504984 –

+0

@JDPace dispiace, non ha visto che –

risposta

4

In sostanza, quello che vuoi è qualcosa di simile a array_diff_assoc, ma applicata a oggetti JSON, e ricorsivo.

Le funzioni array_diff non sono ricorsive a causa di problemi di riferimento: è possibile assegnare un riferimento di una matrice a una voce di tale matrice, rendendo l'array infinitamente ricorsivo. Non penso che sia possibile ottenere la stessa situazione con un oggetto JSON, rendendo così una funzione ricorsiva sicura.

Supponiamo che si desidera calcolare la differenza tra oggetto A e B, e hanno il risultato in oggetto C. Il principio è quello di un ciclo su ogni campo di A (un foreach dovrebbe fare), e quando:

  • tale campo esistono in B, copia sopra C.
  • un campo simile esiste in B, messo in C il risultato della differenza di un campo con campo B, che è una chiamata ricorsiva della funzione diff con quel campo come parametro, così come un oggetto fresco per il risultato.

L'ordine di A deve essere rispettato.

+0

Dovrei piuttosto ordinare il 'json's? –

+2

Non è necessario. –

+1

@BujancaMihai, notare che questo algoritmo non considera le chiavi che appaiono solo in B – Alexander

7

Provare a utilizzare la funzione array_diff

array_diff(json_decode($jsonData1), json_decode($jsonData2));