JSONからデータテーブルへ:NULL列が自動的に削除されないようにする方法は?こんにちは、みんな、
私はJMP15を使用しており、Http Request()を介してJSONペイロードを取得し、Charを介してBlob()に実行し、データテーブルでopen()するJSLを使用しています。 JSONペイロードのコンテンツは動的ですが、常に表形式(行と列)にマップできます。
問題:JSON内のいずれかのキーにすべてNULL値がある場合、それらはデータテーブルに含まれません(つまり、これらのキーの列は作成されません)。 すべての値がNULLであるかどうかに関係なく、JSONのすべてのキーをデータテーブルの列として表示する必要があるため、これは問題があります。
ペイロードをローカルファイルに保存し、Open()を使用して直接開くと、目的の結果が得られます。つまり、すべてのキーが列に変換され、すべてのNULL値がNULLとして表示されるデータテーブルです。 ただし、これは私のユースケースでは機能しません。
これが問題を再現する基本的なJSLです。 Http Request()の代わりに、Load Text File()を使用してデータを取得します。これにより、同じ結果が得られます。 ファイル「data.json」が添付されています。
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 columns変数内のJSONをすべてNULLキーを保持するデータテーブルに変換する方法を誰かが提案できますか?
ありがとう!
アンディ
スクリプティングRe:データテーブルへのJSON:NULL列が自動的に削除されないようにする方法は?私は以下に役立つかもしれない答えを書きました、そして私はあなたが最初に試みるべきである簡単な答えがあることに気づきました。 データはパンダ形式の1つと思われるため、「ワイド」を「パンダ」に変更します。
それが間違っていることが判明した場合は、試してみてください...
ウィザードを使用して列を明示的に選択し、そのスクリプトを使用します。
おそらくスタックオプションも必要になるでしょう。
また、行ジェネレーターをルートからアイテムに変更しました。これは、もう少し正確だからです。 おそらく本当の違いはありません。
行に選択されたアイテムにより、そのアイテムが発生するたびに新しい行がデータテーブルに書き込まれます。 統計をオンにすると、アイテムが2回繰り返されることがわかります。
Re:データテーブルへのJSON:NULL列が自動的に削除されないようにする方法は?提案をありがとう、クレイジ。 私はそれらを試し、いくつかのフォローアップの質問があります:
1. Guessを「wide」から「pandas」に変更すると、データテーブルにNULL列が正常に含まれます。残念ながら、JSONデータの最後の「行」がデータテーブルのすべての行で繰り返されるという新しい問題が発生します(添付の「pandas.png」を参照してください-ロット番号21055は2回繰り返され、ロット番号21054は含まれていません。 私はこれと同じ動作をより大きなデータセットで複製しました)。
これを修正する可能性のある他のOpen()パラメーターまたは構成はありますか?
2.ウィザードを使用して、NULL列を含むdata.jsonファイルを正常にインポートできましたが、生成されたスクリプトはdata.jsonのペイロードに固有です(添付の「script_view.png」を参照)。 私のユースケースはより一般的です。JSLが受け取るペイロードは、列の数と列ラベルによって異なります。 ウィザードの出力を使用して、より一般的な構成オプションを作成する方法はありますか? または、ペイロードを手動で繰り返してデータテーブルを列ごとに作成する唯一のオプションはありますか?
2b。 これに関連して-Open()で「JSON設定」パラメーターを使用するためのドキュメントを教えていただけますか? 構文リファレンスまたはスクリプトインデックスに何も見つかりませんでした(「JMPJSL「JSON設定」」をグーグルで検索すると、このフォーラムでの以前の質問が一番のヒットになります)。
3. Open()に空の列を数値としてインポートさせる方法はありますか? インポート設定で「空の列を数値(1)として扱う」を試したところ、data.jsonファイルが単一の行/レコードとして扱われるようになりました(「pandas_numeric.png」を参照)。何かがおかしい。
ありがとう!
アンディ
Re:データテーブルへのJSON:NULL列が自動的に削除されないようにする方法は?- OK、ワイドオプションを使用するのが正しいオプションだと思います。欠落しているすべての列がインポートから削除されるのはバグです。@Wendy_Murphreyそれは確かに物事を複雑にします。
- 可能なすべての列がわかっていて、サブセットのみがJSONに含まれる場合は、JSON設定でそれらすべてを一覧表示できます。 最初に小さなテストを実行して、必要な方法で機能するかどうかを確認します(JSONに表示される列の完全なセットを取得するのか、サブセットのみを取得するのかはわかりません)。
- 以前のバージョンのJSONインポートコードには引き続きアクセスできます。 JSONを指定すると(JSON設定なしで)、希望どおりの結果が得られる場合があります。
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- JSONは、どのパンダ形式ともまったく同じようには見えません。 しかし、pandasオプションは、必要な列名を取得しているようです。他に何も機能しない場合は、実際にデータを取得するための2回目のインポートのためにJSON設定をその場で作成するための開始点になる可能性があります。
- 私が知っているJSON設定に関する特定のドキュメントはありません。これは、ウィザードによって記述され、人間が読める形式であることが意図されています。 ウィザードダイアログの値と一致し、そこにいくつかのドキュメントがあります。
- ImportOptionsはCSVインポートで使用されていると確信しています。 JSONウィザードでは使用されません。
Re:データテーブルへのJSON:NULL列が自動的に削除されないようにする方法は?また、jsonのソースを制御でき、それを実際のパンダ形式として取得できる場合は、
orient='table' (in python code)
良い選択かもしれません。 JMPのインポートでは、そのメタデータの一部を使用できます。 JMPは他の方向も読み取ることができます。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
Re:データテーブルへのJSON:NULL列が自動的に削除されないようにする方法は?メモをありがとう、 @Craige_Hales 。箇条書き1に記載されている欠陥を、JMPの将来のリリースで検討するために開発チームに報告しました。
価値があるのは、これらがJMP14.3のnull列を削除しないようです。
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" ) );
Re:データテーブルへのJSON:NULL列が自動的に削除されないようにする方法は?要素を持たないJSON配列は、JMPにとって問題があります。1つのオプションは、空の配列を少なくとも1つの子を持つ配列に置き換えることです。その子をnullにするか、欠落値文字-[。]を使用できます。これは、有効なJSONがなくなることを意味すると思いますが、JMP 16は引き続きそれを読み取り、現時点ではその動作を中断する予定はありません。nullを使用すると文字列が作成され、不足している値を使用すると数値列が作成されます。JSONに[]を含む文字列データがないことがわかっている場合は、この変更を行うだけで済みます。
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
JSON文字列の[]の置き換えを防ぎたい場合は、文字列をスキップするためにjslをさらに数行必要としますが、それでもそれほど難しくはありません。