Da JSON a tabella dati: come evitare che le colonne NULL vengano automaticamente eliminate?Ciao a tutti,
Sto usando JMP 15 e ho JSL che recupera un payload JSON tramite Http Request (), lo esegue tramite Char su Blob () e quindi lo apre () in una tabella dati. Il contenuto del payload JSON è dinamico, ma è sempre mappabile in un formato tabulare (righe e colonne).
Il problema: se una qualsiasi chiave nel JSON ha tutti i valori NULL, non viene inclusa nella tabella dei dati (cioè, non vengono create colonne per queste chiavi). Questo è problematico, perché desidero che tutte le chiavi in JSON vengano visualizzate come colonne nella tabella dati, indipendentemente dal fatto che tutti i valori siano NULL o meno.
Se salvo il payload in un file locale e lo apro direttamente utilizzando Open (), ottengo il risultato desiderato: una tabella di dati in cui tutte le chiavi vengono convertite in colonne e tutti i valori NULL vengono visualizzati come NULL. Tuttavia, questo non funzionerà per il mio caso d'uso.
Ecco il JSL di base che replica il problema. Invece di Http Request (), recupero i dati con Load Text File (), che dà gli stessi risultati. Il file "data.json" è allegato.
dt1 = Open("/Users/abc/data.json", JSON ); // works as desired
raw = Load Text File("/Users/abc/data.json");
jsonblob = Char To Blob( raw );
dt2 = open(jsonblob, "JSON", Guess("wide")); // does not work as desired -- drops all-NULL columnsQualcuno può suggerire un metodo per convertire JSON in una variabile in una tabella di dati che conserva le chiavi all-NULL?
Grazie!
Andy
ScriptingRi: JSON alla tabella dati: come evitare che le colonne NULL vengano automaticamente eliminate?Ho scritto una risposta di seguito che potrebbe aiutare, poi ho capito che c'è una risposta semplice che dovresti provare prima. I dati sembrano essere uno dei formati dei panda, quindi cambia "largo" in "panda".
Se risulta sbagliato, prova ...
Utilizza la procedura guidata per selezionare esplicitamente le colonne, quindi utilizza quello script.
Probabilmente vorrai anche l'opzione stack.
Ho anche cambiato il generatore di righe da root a elementi, perché è un po 'più corretto. Probabilmente non farà davvero la differenza.
L'elemento selezionato per Riga fa sì che una nuova riga venga scritta nella tabella dati ogni volta che si verifica l'elemento. Attiva le statistiche e puoi vedere gli elementi che si ripete 2 volte.
Ri: JSON alla tabella dati: come evitare che le colonne NULL vengano automaticamente eliminate?Grazie per i suggerimenti, Craige. Li ho provati e ho alcune domande di follow-up:
1. la modifica di Guess da "wide" a "pandas" include correttamente le colonne NULL nella tabella dati - sfortunatamente, introduce un nuovo problema: l'ultima "riga" di dati JSON viene ripetuta per ogni riga della tabella dati ( vedere "pandas.png", allegato - Il numero di lotto 21055 viene ripetuto due volte e il numero di lotto 21054 non è incluso. Ho replicato questo stesso comportamento con un set di dati più ampio).
C'è qualche altro parametro o configurazione Open () che potrebbe correggerlo?
2. Sono stato in grado di importare con successo il file data.json, comprese le colonne NULL, utilizzando la procedura guidata - tuttavia, lo script che ha prodotto è specifico per il payload in data.json (vedere "script_view.png", allegato). Il mio caso d'uso è più generale: i payload ricevuti dal mio JSL variano in numero di colonne ed etichette di colonna. C'è un modo per utilizzare l'output della procedura guidata per creare un'opzione di configurazione più generica? O è la mia unica opzione per iterare manualmente sul payload e costruire la tabella dei dati colonna per colonna?
2b. In relazione a questo, puoi indicarmi qualsiasi documentazione per l'utilizzo del parametro "Impostazioni JSON" con Open ()? Non sono riuscito a trovare nulla nel riferimento alla sintassi o nell'indice di scripting (e quando cerco su Google "JMP JSL" Impostazioni JSON ", la risposta più importante è la mia domanda precedente su questo forum).
3. Esiste un modo per forzare Open () a importare colonne vuote come numeriche? Ho provato "Considera le colonne vuote come numeriche (1)" nelle impostazioni di importazione e il file data.json viene trattato come una singola riga / record (vedi "pandas_numeric.png, allegato), quindi presumo che lo sto facendo qualcosa di sbagliato.
Grazie!
Andy
Ri: JSON alla tabella dati: come evitare che le colonne NULL vengano automaticamente eliminate?- OK, penso che l'opzione ampia sia l'opzione corretta da usare ed è un bug che le colonne mancanti vengano rimosse dall'importazione.@Wendy_Murphrey Certamente rende le cose complicate.
- Se conosci tutte le colonne possibili e solo un sottoinsieme sarà in JSON, puoi elencarle tutte nelle Impostazioni JSON. Prima fai un piccolo test, vedi se funziona come ti serve (non sono sicuro che otterrai l'intero set di colonne o solo il sottoinsieme che appare nel JSON.)
- È ancora possibile accedere a una versione precedente del codice di importazione JSON; specificando JSON (senza le IMPOSTAZIONI JSON) potresti fare quello che vuoi.
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- Il JSON non assomiglia esattamente a nessuno dei formati panda. Ma l'opzione panda sembra recuperare i nomi delle colonne che desideri; se nient'altro funziona, potrebbe essere un punto di partenza per creare le impostazioni JSON al volo per una seconda importazione per ottenere davvero i dati.
- Non esiste un documento specifico sulle impostazioni JSON di cui sono a conoscenza; è concepito per essere scritto dal mago ed è ancora leggibile dall'uomo. Corrisponde ai valori della finestra di dialogo della procedura guidata e lì è presente un documento.
- Sono abbastanza sicuro che le ImportOptions siano utilizzate dall'importazione CSV e forse qualcos'altro. Non vengono utilizzati dalla procedura guidata JSON.
Ri: JSON alla tabella dati: come evitare che le colonne NULL vengano automaticamente eliminate?E se hai il controllo sulla fonte del json e puoi ottenerlo come un vero formato panda,
orient='table' (in python code)
potrebbe essere una buona scelta. L'importazione di JMP può utilizzare alcuni di questi metadati. JMP può leggere anche gli altri orientamenti.
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
Ri: JSON alla tabella dati: come evitare che le colonne NULL vengano automaticamente eliminate?Grazie per la nota, @Craige_Hales .Ho segnalato la carenza rilevata al punto 1 al team di sviluppo per la considerazione in una futura versione di JMP.
Per quello che vale, sembra che questi non eliminino le colonne nulle in JMP 14.3.
raw = Load Text File( "$DOWNLOADS/data.json" );
jsonblob = Char To Blob( raw );
dt2 = Open( jsonblob, "JSON", Guess( "wide" ) );
JSON To Data Table( raw, Guess( "wide" ) );
Ri: JSON alla tabella dati: come evitare che le colonne NULL vengano automaticamente eliminate?Gli array JSON che non hanno elementi sono problematici per JMP.Un'opzione è sostituire gli array vuoti con array che hanno almeno un figlio.Puoi rendere quel figlio nullo o utilizzare il carattere del valore mancante - [.].Penso che questo significhi che non avrai più un JSON valido, ma JMP 16 lo leggerà ancora e in questo momento non ci sono piani per interrompere quel comportamento.L'uso di null creerà una colonna di caratteri e l'utilizzo del valore mancante creerà una colonna numerica.Se sai che non ci sono dati di stringa nel tuo JSON che contengono [], puoi semplicemente apportare questa modifica
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
Se vuoi proteggerti dalla sostituzione di [] nelle stringhe JSON, ci vorranno ancora qualche riga di jsl per saltare le stringhe, ma non dovrebbe essere troppo difficile.