2024年9月11日水曜日

Genson-jsをMLEモジュールとして作成しJSONデータからJSONスキーマを生成する

JavaScriptライブラリのGenson-jsをOracle Database 23aiのMLEモジュールとして作成し、サーバーサイドでJSONデータからJSONスキーマを生成します。

以下のスクリプトを実行し、Genson-jsのESモジュールからOracle Database 23aiのMLEモジュールを作成します。

SQLワークショップSQLスクリプトとして実行するか、(SQLコマンドでは1行ごとでしか実行できないため)1行ごとにSQLコマンドで実行します。

最初にMLEモジュールESM_GENSON_JS_0_0_8を作成します。


モジュールESM_GENSON_JS_0_0_8を含むMLE環境JSONENVを作成します。


以上で、データベース・サーバーでGenson-jsを呼び出せるようになりました。

SQLコマンドで以下を実行し動作を確認します。SQLコマンド言語としてJavaScript(MLE)を選択し、環境に先ほど作成したJSONENVを指定します。
const Genson = await import('/npm/genson-js@0.0.8/+esm');

const jsonData = {
    "firstName": "Sakura",
    "age": 35
};

const schema = Genson.createSchema(
    jsonData
);

console.log(JSON.stringify(schema, null, 2));
スクリプトを実行してJSONスキーマが出力されれば、Genson-jsは正しくMLEモジュールとして作成されています。


JSONデータからJSONスキーマを生成する機能と、JSONスキーマのマージを行う機能を組み込んだ、簡単なAPEXアプリケーションを作成します。

アプリケーション作成ウィザードを起動します。作成するアプリケーションの名前JSON Schema Generator by Genson-jsとします。

ページの追加をクリックし、ページ名Create Schemaとした空白のページとMerge Schemasとした空白のページを追加します。

以上で、アプリケーションの作成を実行します。


アプリケーションが作成されます。アプリケーションはCreate SchemaMerge Schemasのページを含みます。


このアプリケーションからGenson-jsを呼び出すために、MLE環境として作成したJSONENVを紐づけます。

アプリケーション定義セキュリティを開き、データベース・セッションMLE環境に、JSONENVを設定します。

以上の設定で、このアプリケーション内でGensos-jsを呼び出すことができるようになります。


Create Schemaのページを開き、JSONデータからJSONスキーマを生成する機能を実装します。

JSONデータを入力するページ・アイテムとしてP2_JSON_DATAを作成します。タイプテキスト領域です。続いて、JSONデータからJSONスキーマを生成するボタンCREATE_JSON_SCHEMAを作成します。動作アクションページの送信です。生成したJSONスキーマを保存するページ・アイテムとしてP2_JSON_SCHEMAを作成します。タイプテキスト領域です。


ボタンCREATE_JSON_SCHEMAを押した時に実行されるプロセスを作成します。

識別名前Create JSON Schemaとします。タイプコードを実行です。ソース言語JavaScript(MLE)を選択し、JavaScriptコードとして以下を記述します。
const Genson = await import('/npm/genson-js@0.0.8/+esm');

const jsonData = JSON.parse(apex.env.P2_JSON_DATA);

const schema = Genson.createSchema(
    jsonData
);

apex.env.P2_JSON_SCHEMA = JSON.stringify(schema, null, 2);
サーバー側の条件ボタン押下時CREATE_JSON_SCHEMAを指定します。


以上でCreate Schemaのページは完成です。ページを実行すると以下のように動作します。


Merge Schemasのページを開き、JSONスキーマをマージする機能を実装します。

JSONスキーマを入力するページ・アイテムとしてP3_JSON_SCHEMA_1P3_JSON_SCHEMA_2を作成します。Genson_jsのファンクションmergeSchemaの引数はマージするJSONスキーマの配列を受け付けるため、2つ以上のJSONスキーマを一度にマージすることができます。ただし、このページでは2つに限定しています。

JSONスキーマをマージするボタンMERGE_JSON_SCHEMAを作成します。動作アクションページの送信です。生成したJSONスキーマを保存するページ・アイテムとしてP3_JSON_SCHEMAを作成します。


ボタンMERGE_JSON_SCHEMAを押した時に実行されるプロセスを作成します。

識別名前Merge JSON Schemaとします。タイプコードを実行です。ソース言語JavaScript(MLE)を選択し、JavaScriptコードとして以下を記述します。
const Genson = await import('/npm/genson-js@0.0.8/+esm');

const jsonSchema1 = JSON.parse(apex.env.P3_JSON_SCHEMA_1);
const jsonSchema2 = JSON.parse(apex.env.P3_JSON_SCHEMA_2);

const schema = Genson.mergeSchemas(
    [ jsonSchema1, jsonSchema2 ]
);

apex.env.P3_JSON_SCHEMA = JSON.stringify(schema, null, 2);

以上でMerge Schemaのページは完成です。ページを実行すると以下のように動作します。


以上でアプリケーションは完成です。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/json-schema-generator-by-genson-js.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。