JSON in Datentabelle: Wie kann verhindert werden, dass NULL-Spalten automatisch gelöscht werden?Hallo alle,
Ich verwende JMP 15 und habe JSL, das eine JSON-Nutzlast über Http Request() abruft, sie über Char an Blob() ausführt und sie dann in einer Datentabelle öffnet(). Der Inhalt der JSON-Nutzlast ist dynamisch, kann jedoch jederzeit einem Tabellenformat (Zeilen und Spalten) zugeordnet werden.
Das Problem: Wenn Schlüssel im JSON alle NULL-Werte haben, werden sie nicht in die Datentabelle aufgenommen (d. h. es werden keine Spalten für diese Schlüssel erstellt). Das ist problematisch, weil ich möchte, dass alle Schlüssel im JSON als Spalten in der Datentabelle angezeigt werden, unabhängig davon, ob alle Werte NULL sind oder nicht.
Wenn ich die Payload 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 umgewandelt werden und alle NULL-Werte als NULL-Werte angezeigt werden. Dies wird jedoch für meinen Anwendungsfall nicht funktionieren.
Hier ist eine einfache JSL, die das Problem repliziert. Anstelle von Http Request() rufe ich die Daten mit Load Text File() ab, was zu den gleichen 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 zum Konvertieren von JSON in einer Variablen in eine Datentabelle vorschlagen, die alle NULL-Schlüssel beibehält?
Danke!
Andy
Ergebnisse teilen und kommunizierenBetreff: JSON in Datentabelle: Wie kann verhindert werden, dass NULL-Spalten automatisch gelöscht werden?JSON-Arrays, die keine Elemente enthalten, sind für JMP problematisch.Eine Möglichkeit besteht darin, leere Arrays durch Arrays zu ersetzen, die mindestens ein untergeordnetes Element haben.Sie können dieses untergeordnete Element auf null setzen oder das fehlende Wertzeichen verwenden – [.].Ich denke, das bedeutet, dass Sie kein gültiges JSON mehr haben, JMP 16 es aber trotzdem lesen wird und es derzeit keinen Plan gibt, 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 einfach diese Änderung vornehmen
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
Wenn Sie sich gegen das Ersetzen von [] in JSON-Strings schützen möchten, sind zum Überspringen von Strings noch ein paar JSL-Zeilen erforderlich, es sollte aber trotzdem nicht zu schwierig sein.
Betreff: JSON in Datentabelle: Wie kann verhindert werden, dass NULL-Spalten automatisch gelöscht werden?Danke für den Hinweis, @Craige_Hales .Ich habe den in Punkt 1 genannten Mangel dem Entwicklungsteam zur Berücksichtigung in einer zukünftigen Version von JMP gemeldet.
Es scheint, 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 in Datentabelle: Wie kann verhindert werden, dass NULL-Spalten automatisch gelöscht werden?Und wenn Sie 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. Der JMP-Import kann einige dieser Metadaten verwenden. JMP kann auch die anderen Ausrichtungen lesen.
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
Betreff: JSON in Datentabelle: Wie kann verhindert werden, dass NULL-Spalten automatisch gelöscht werden?- OK, ich denke, die Option „Wide“ ist die richtige Option und es ist ein Fehler, dass alle fehlenden Spalten aus dem Import entfernt werden.@Wendy_Murphrey Es macht die Sache auf jeden Fall 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 zunächst einen kleinen Test durch und prüfen Sie, ob er Ihren Anforderungen entspricht (ich bin mir nicht sicher, ob Sie den gesamten Spaltensatz oder nur den Teilsatz erhalten, der im JSON angezeigt wird).
- Es besteht weiterhin Zugriff auf eine frühere Version des JSON-Importcodes. Die Angabe von JSON (ohne den Parameter JSON SETTINGS oder Guess) kann das bewirken, was Sie wollen.
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- Das JSON sieht nicht genau wie eines der Pandas-Formate aus. Aber die Option pandas scheint die gewünschten Spaltennamen abzurufen; Wenn nichts anderes funktioniert, könnte dies ein Ausgangspunkt für die spontane Erstellung der JSON-Einstellungen für einen zweiten Import sein, um wirklich die Daten zu erhalten.
- Mir ist kein spezifisches Dokument zu den JSON-Einstellungen bekannt. Es soll vom Assistenten geschrieben werden und dennoch für Menschen lesbar sein. Es entspricht den Werten des Assistentendialogs und es gibt dort ein Dokument.
- Ich bin mir ziemlich sicher, dass die ImportSettings vom CSV-Import verwendet werden, und vielleicht auch von etwas anderem. Sie werden vom JSON-Assistenten nicht verwendet.
(Update: ein paar kleine Änderungen)
Betreff: JSON in Datentabelle: Wie kann verhindert werden, dass NULL-Spalten automatisch gelöscht werden?Danke für die Vorschläge, Craige. Ich habe sie ausprobiert und habe ein paar weitere Fragen:
1. Die Änderung von Guess von „wide“ in „pandas“ schließt die NULL-Spalten erfolgreich in die Datentabelle ein – leider führt dies zu einem neuen Problem: Die letzte „Zeile“ der JSON-Daten wird für jede Zeile der Datentabelle wiederholt ( siehe „pandas.png“ im Anhang – Losnummer 21055 wird zweimal wiederholt und Losnummer 21054 ist nicht enthalten. Ich habe dasselbe Verhalten mit einem größeren Datensatz repliziert.
Gibt es einen anderen Open()-Parameter oder eine andere Open()-Konfiguration, die das Problem beheben könnte?
2. Ich konnte die Datei data.json, einschließlich NULL-Spalten, mit dem Assistenten erfolgreich importieren – das erstellte Skript ist jedoch spezifisch für die Nutzlast in data.json (siehe „script_view.png“ im Anhang). Mein Anwendungsfall ist allgemeiner – die Nutzlasten, 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 besteht meine einzige Möglichkeit darin, die Nutzlast manuell zu durchlaufen und die Datentabelle Spalte für Spalte zu erstellen?
2b. Können Sie mir in diesem Zusammenhang eine Dokumentation zur Verwendung des Parameters „JSON-Einstellungen“ mit Open() nennen? Ich konnte in der Syntaxreferenz oder im Skriptindex nichts finden (und wenn ich „JMP JSL „JSON-Einstellungen““ google, ist der Top-Treffer meine vorherige Frage in diesem Forum).
3. Gibt es eine Möglichkeit, Open() zu zwingen, leere Spalten als Numerisch zu importieren? Ich habe in den Importeinstellungen versucht, „Leere Spalten als numerisch (1) zu behandeln“, und dies hat dazu geführt, dass die Datei „data.json“ als eine einzelne Zeile/einen einzelnen Datensatz behandelt wurde (siehe „pandas_numeric.png, im Anhang“), also gehe ich davon aus, dass ich das tue etwas stimmt nicht.
Danke!
Andy
Betreff: JSON in Datentabelle: Wie kann verhindert werden, dass NULL-Spalten automatisch gelöscht werden?Ich habe unten eine Antwort geschrieben, die hilfreich sein könnte, und dann wurde mir klar, dass es eine einfache Antwort gibt, die Sie zuerst ausprobieren sollten. Die Daten scheinen eines der Pandas-Formate zu sein, also ändern Sie „wide“ in „pandas“.
Wenn sich das als falsch herausstellt, versuchen Sie es...
Verwenden Sie den Assistenten, um die Spalten explizit auszuwählen, und verwenden Sie dann dieses Skript.
You'll probably want the stack option too.You'll probably want the stack option too.Wahrscheinlich möchten Sie auch die Stapeloption.
Ich habe auch den Zeilengenerator von „root“ auf „items“ geändert, weil er etwas korrekter ist. Wird wahrscheinlich 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. Schalten Sie die Statistiken ein und Sie können sehen, dass sich die Elemente zweimal wiederholen.