2012-10-09 18 views
8

Ho un problema che mi piacerebbe risolvere per non dover dedicare molto lavoro manuale ad analizzare come alternativa.JSON diff di grandi dati JSON, trovare alcuni JSON come sottoinsieme di un altro JSON

Ho 2 oggetti JSON (restituiti da API di servizi Web diverse o risposte HTTP). Vi sono dati intersecanti tra i 2 oggetti JSON e condividono la struttura JSON simile, ma non identici. Un JSON (il più piccolo) è come un sottoinsieme dell'oggetto JSON più grande.

Voglio trovare tutti i dati di intercettazione tra i due oggetti. In realtà, sono più interessato ai parametri/proprietà condivisi all'interno dell'oggetto, non ai reali valori dei parametri/proprietà di ciascun oggetto. Perché voglio utilizzare i dati di un output JSON per costruire l'altro JSON come input per una chiamata API. Sfortunatamente, non ho la documentazione che definisce il JSON per ciascuna API. :(

Ciò che rende questo più difficile sono gli oggetti JSON sono enormi. Una campate una pagina se si stampa tramite Blocco note di Windows. Le altre campate 37 pagine. Le API restituiscono l'output JSON compressa come una singola riga. Testo normale confrontare non fa molto, dovrei riformattare manualmente o w/script per scomporre l'oggetto w/newline, ecc. per un confronto di testo funzionare bene. Ho provato con lo strumento Beyond Compare.

Potrei fare il manuale search/grep ma è un problema scorrere tutti i parametri all'interno del JSON più piccolo, scrivere codice per farlo ma dovrei anche dedicare del tempo per farlo e testare se il codice funziona anche. codice già creato per quello ...

Oppure è possibile cercare strumenti di tipo diff JSON. Ho cercato un po '. Mi sono imbattuto in questi:

https://github.com/samsonjs/json-diff o https://tlrobinson.net/projects/javascript-fun/jsondiff

https://github.com/andreyvit/json-diff

sia riuscito a fare quello che volevo. Presumibilmente, il JSON è troppo complesso o troppo grande per essere elaborato.

Qualche idea sulla soluzione migliore? O potrebbe la soluzione migliore per ora essere l'analisi manuale w/grep per ogni parametro/proprietà?

In termini di una soluzione di codice, qualsiasi linguaggio lo farà. Ho solo bisogno di un parser o strumento diff che farà ciò che voglio.

Siamo spiacenti, non è possibile condividere la struttura dati JSON con te, può essere considerato riservato.

+0

Sei consapevole che si può facilmente pretty-stampa i dati JSON con a capo e rientro? –

+0

FWIW: 37 pagine di visualizzazione del testo JSON sono lontane da "enormi"; Non lo considererei evento "grande", ma piuttosto "non piccolo". –

+0

@ user1689607, come si possono stampare i dati JSON? Non sono uno sviluppatore web di ajax/jquery/js, non ho realizzato web dev w/ultime tecnologie, solo anni fa non facevo cose ajax. Ho appena provato le app al giorno d'oggi. – David

risposta

1

Ho un piccolo progetto GPL che farebbe il trucco per semplice JSON. Non ho aggiunto il supporto per le entità nidificate in quanto è più una semplice soluzione ObjectDB e non in realtà JSON (Nonostante sia chiaramente ispirato da esso.

Lunga e breve l'API è piuttosto semplice. Crea un nuovo gruppo, popolarla, e poi tirare un sottoinsieme tramite qualunque parametri logica è necessario

https://github.com/danielbchapman/groups

L'API è utilizzato fondamentalmente come -.>

SubGroup items = group 
        .notEqual("field", "value") 
        .lessThan("field2", 50); //...etc... 

in realtà c'è il supporto per i sindacati di base e si unisce, che farebbe praticamente quello che vuoi

Molto probabilmente si desidera un Set come tipo di dati. Considerando che i tuoi confronti sono probabilmente complessi, hai bisogno di un insieme più complesso di metodi.

La mia unica precauzione è che è GPL. Se i tuoi dati sono confidenziali, potresti non essere interessato a quella licenza.

+0

grazie, vedrò quello a volte, non so se è quello che mi serve comunque. – David

8

Beyond Compare funziona bene, se si imposta un formato di file JSON al suo interno per utilizzare Python per stampare in modo corretto il JSON. Impostazione di esempio per Windows:

  1. Installare Python 2.7.
  2. In Al di là di Confronta, vai sotto Strumenti, sotto Formati di file.
  3. Fare clic su Nuovo. Scegli il formato del testo. Inserisci "JSON" come nome.
  4. Nella scheda Generale:
    • Mask: *.json
  5. Nella scheda di conversione:
    • conversione: Programma esterno (nomi di file Unicode)
    • Caricamento: c:\Python27\python.exe -m json.tool %s %t
      • Nota, quel secondo parametro nella riga di comando deve essere %t, se inserisci due %s s subirai una perdita di dati.
  6. Fare clic su Salva.
+1

Ho dovuto inserire "c: \ Python27 \ python.exe -m json.tool% s% t" per il percorso di caricamento (% t anziché% s per quest'ultima variabile). –

2

Jeremy Simmons ha creato un formato migliore file del pacchetto Posted on forum: "JsonFileFormat.bcpkg" per BEYOND COMPARE che non richiede pitone o in modo da installare.

Basta scaricare il file e aprirlo con BC e sei a posto. Quindi, è molto più semplice.

formato JSON File

avevo bisogno di un formato di file per i file JSON.

Ho voluto stampare in modo corretto il mio JSON per semplificare il confronto con lo &.

Ho allegato il mio bcpackage con il mio formato di file JSON completato.

La formattazione avviene tramite JQ - http://stedolan.github.io/jq/

Props a Stephen Dolan per l'utilità https://github.com/stedolan.

ho inviato un messaggio alla gente a Scooter Software chiedendo loro di includere nella pagina con i formati aggiuntivi.

Se sei interessato a vederlo lì, sono sicuro che una rapida risposta a la discussione con un up-voto li aiuterebbe a vedere il valore pubblicandolo. file allegati Tipo di file: bcpkg JsonFileFormat.bcpkg (449,8 KB, 58 visualizzazioni)

+0

Hmm ... Mi chiedo con che versione funziona o con i passaggi esatti di installazione. Su un Mac con BC4. Su Strumenti> Importa impostazioni, seleziona il file pkg scaricato, quindi la schermata successiva serve a selezionare i formati di file da importare ed è vuota e non può procedere, a meno che non selezioni la casella di controllo "elimina tutti i formati di file esistenti", ma non lo faccio Suppongo che sia una buona idea, mi sono fermato lì. – David

+0

@David - Sto usando questo su BC3 + Windows 8.1 x 64. Il problema è che utilizza un file .exe di Windows, quindi non sono sicuro di come metterlo su un Mac. Anche se esiste una versione OSX dell'app. Potresti provare questo su un Windows per testarlo e/o contattare l'autore del pacchetto su come farlo per Mac. Il mio pensiero è che non dovrebbe essere così complicato fare lo stesso su Mac - Ma dato che non ne ho uno non riesco a capirlo. –

+0

@David - Ho pubblicato anche una soluzione basata su BC per SQLite - qui: http://sqa.stackexchange.com/a/14283/13028 - Questo mostra come configurare i tipi di file su BC. Entrambe sono le estensioni di file fornite dagli utenti per BC. Uno è preconfezionato, l'altro ha un How To. Fammi sapere se questo funziona per te. Se no, cercherò di aiutarti con questo quando avrò più tempo PS: Ancora una volta, non ho un Mac quindi non ho potuto testarlo di sicuro. –