JSON zur Datentabelle: Wie kann vermieden werden, dass NULL-Spalten automatisch gelöscht werden?Hallo zusammen,
Ich verwende JMP 15 und habe JSL, die eine JSON-Nutzlast über Http Request () abruft, sie über Char to Blob () ausführt und sie dann in einer Datentabelle öffnet (). Der JSON-Nutzdateninhalt ist dynamisch, kann jedoch immer einem Tabellenformat (Zeilen und Spalten) zugeordnet werden.
Das Problem: Wenn Schlüssel in JSON alle NULL-Werte haben, werden sie nicht in die Datentabelle aufgenommen (dh für diese Schlüssel werden keine Spalten erstellt). Dies ist problematisch, da alle Schlüssel im JSON als Spalten in der Datentabelle angezeigt werden sollen, unabhängig davon, ob alle Werte NULL sind oder nicht.
Wenn ich die Nutzdaten in einer lokalen Datei speichere und sie direkt mit Open () öffne, erhalte ich das gewünschte Ergebnis: eine Datentabelle, in der alle Schlüssel in Spalten konvertiert und alle NULL-Werte als NULL-Werte angezeigt werden. Dies funktioniert jedoch nicht für meinen Anwendungsfall.
Hier ist eine grundlegende JSL, die das Problem repliziert. Anstelle von Http Request () rufe ich die Daten mit Load Text File () ab, was zu denselben Ergebnissen führt. Die Datei "data.json" ist angehängt.
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 columnsKann jemand eine Methode vorschlagen, um JSON in einer Variablen in eine Datentabelle zu konvertieren, in der alle NULL-Schlüssel erhalten bleiben?
Vielen Dank!
Andy
SkriptingBetreff: JSON zur Datentabelle: Wie kann vermieden werden, dass NULL-Spalten automatisch gelöscht werden?Ich habe unten eine Antwort geschrieben, die helfen könnte, und dann festgestellt, dass es eine einfache Antwort gibt, die Sie zuerst versuchen sollten. Die Daten scheinen eines der Pandas-Formate zu sein, ändern Sie also "wide" in "pandas".
Wenn sich das als falsch herausstellt, versuchen Sie ...
Verwenden Sie den Assistenten, um die Spalten explizit auszuwählen, und verwenden Sie dann dieses Skript.
Sie werden wahrscheinlich auch die Stapeloption wollen.
Ich habe auch den Zeilengenerator von root auf items geändert, da er etwas korrekter ist. Wahrscheinlich wird es keinen wirklichen Unterschied machen.
Das für Zeile ausgewählte Element bewirkt, dass jedes Mal, wenn dieses Element auftritt, eine neue Zeile in die Datentabelle geschrieben wird. Wenn Sie die Statistik einschalten, können Sie sehen, dass sich die Elemente zweimal wiederholen.
Betreff: JSON zur Datentabelle: Wie kann vermieden werden, dass NULL-Spalten automatisch gelöscht werden?Danke für die Vorschläge, Craige. Ich habe sie ausprobiert und habe ein paar Anschlussfragen:
1. Wenn Sie Guess von "wide" in "pandas" ändern, werden die NULL-Spalten erfolgreich in die Datentabelle aufgenommen. Leider tritt ein neues Problem auf: Die letzte "Zeile" der JSON-Daten wird für jede Zeile der Datentabelle wiederholt ( siehe "pandas.png" im Anhang - Die Chargennummer 21055 wird zweimal wiederholt, und die Chargennummer 21054 ist nicht enthalten. Ich habe dasselbe Verhalten mit einem größeren Datensatz repliziert.
Gibt es einen anderen Open () -Parameter oder eine andere Konfiguration, die dies korrigieren könnte?
2. Ich konnte die Datei data.json, einschließlich der NULL-Spalten, mithilfe des Assistenten erfolgreich importieren. Das erstellte Skript ist jedoch spezifisch für die Nutzdaten in data.json (siehe "script_view.png" im Anhang). Mein Anwendungsfall ist allgemeiner - die Nutzdaten, die meine JSL empfängt, variieren in der Anzahl der Spalten und Spaltenbezeichnungen. Gibt es eine Möglichkeit, die Ausgabe des Assistenten zu verwenden, um eine allgemeinere Konfigurationsoption zu erstellen? Oder ist meine einzige Möglichkeit, die Nutzdaten manuell zu durchlaufen und die Datentabelle spaltenweise zu erstellen?
2b. Im Zusammenhang damit - können Sie mich auf eine Dokumentation zur Verwendung des Parameters "JSON-Einstellungen" mit Open () verweisen? Ich konnte nichts in der Syntaxreferenz oder im Skriptindex finden (und wenn ich "JMP JSL" JSON-Einstellungen "google, ist der Top-Hit meine vorherige Frage in diesem Forum).
3. Gibt es eine Möglichkeit, Open () zu zwingen, leere Spalten als numerisch zu importieren? Ich habe versucht, "Leere Spalten als numerisch (1) behandeln" in den Importeinstellungen zu behandeln, und dadurch wurde die Datei "data.json" als einzelne Zeile / Datensatz behandelt (siehe "pandas_numeric.png, angehängt") etwas falsch.
Vielen Dank!
Andy
Betreff: JSON zur Datentabelle: Wie kann vermieden werden, dass NULL-Spalten automatisch gelöscht werden?- OK, ich denke, die breite Option ist die richtige Option und es ist ein Fehler, dass alle fehlenden Spalten aus dem Import entfernt werden.@ Wendy_Murphrey Das macht die Sache sicherlich kompliziert.
- Wenn Sie alle möglichen Spalten kennen und nur eine Teilmenge im JSON enthalten ist, können Sie alle in den JSON-Einstellungen auflisten. Führen Sie zuerst einen kleinen Test durch, um festzustellen, ob er wie gewünscht funktioniert (ich bin nicht sicher, ob Sie den vollständigen Satz von Spalten oder nur die Teilmenge erhalten, die im JSON angezeigt wird.)
- Es besteht weiterhin Zugriff auf eine frühere Version des JSON-Importcodes. Die Angabe von JSON (ohne die JSON-EINSTELLUNGEN) kann das tun, was Sie wollen.
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- Der JSON sieht nicht genau wie eines der Pandas-Formate aus. Die Option pandas scheint jedoch die gewünschten Spaltennamen abzurufen. Wenn nichts anderes funktioniert, ist dies möglicherweise ein Ausgangspunkt für die sofortige Erstellung der JSON-Einstellungen für einen zweiten Import, um die Daten wirklich abzurufen.
- Es gibt kein spezielles Dokument zu den JSON-Einstellungen, das mir bekannt ist. Es soll vom Assistenten geschrieben und dennoch für Menschen lesbar sein. Es stimmt mit den Werten des Assistentendialogs überein, und dort befindet sich ein Dokument.
- Ich bin mir ziemlich sicher, dass die ImportOptions vom CSV-Import verwendet werden, und vielleicht noch etwas anderes. Sie werden vom JSON-Assistenten nicht verwendet.
Betreff: JSON zur Datentabelle: Wie kann vermieden werden, dass NULL-Spalten automatisch gelöscht werden?Und wenn Sie die Kontrolle über die Quelle des JSON haben und es als echtes Pandas-Format erhalten können,
orient='table' (in python code)
könnte eine gute Wahl sein. Beim Import von JMP können einige dieser Metadaten verwendet werden. JMP kann auch die anderen Ausrichtungen lesen.
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
Betreff: JSON zur Datentabelle: Wie kann vermieden werden, dass NULL-Spalten automatisch gelöscht werden?Danke für den Hinweis, @Craige_Hales .Ich habe den in Punkt 1 festgestellten Mangel dem Entwicklungsteam zur Prüfung in einer zukünftigen Version von JMP gemeldet.
Für das, was es wert ist, scheint es, dass diese die Nullspalten in JMP 14.3 nicht löschen.
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" ) );
Betreff: JSON zur Datentabelle: Wie kann vermieden werden, dass NULL-Spalten automatisch gelöscht werden?JSON-Arrays ohne Elemente sind für JMP problematisch.Eine Möglichkeit besteht darin, leere Arrays durch Arrays mit mindestens einem untergeordneten Array zu ersetzen.Sie können dieses untergeordnete Element auf null setzen oder das fehlende Wertzeichen [.] Verwenden.Ich denke, dies bedeutet, dass Sie keinen gültigen JSON mehr haben, aber JMP 16 wird ihn weiterhin lesen, und derzeit ist nicht geplant, dieses Verhalten zu unterbrechen.Wenn Sie null verwenden, wird eine Zeichenspalte erstellt, und wenn Sie den fehlenden Wert verwenden, wird eine numerische Spalte erstellt.Wenn Sie wissen, dass Ihr JSON keine Zeichenfolgendaten enthält, die [] enthalten, können Sie diese Änderung einfach vornehmen
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
Wenn Sie sich vor dem Ersetzen von [] in JSON-Zeichenfolgen schützen möchten, werden einige weitere Zeilen jsl benötigt, um Zeichenfolgen zu überspringen, sollten aber dennoch nicht zu schwer sein.