JSONで関数やプログラムコードは保存できる?JavaScript Object Notationの値として扱えるデータの種類を解説

Oracle

JSON(JavaScript Object Notation)は、Web APIや設定ファイル、データ交換などで広く利用されているデータ形式です。名前にJavaScriptが含まれているため、関数や実行可能なプログラムコードも保存できるのではないかと疑問に思うことがあります。

しかし、JSONはあくまでデータを表現するための形式であり、プログラムの命令そのものを保持する仕組みではありません。この記事では、JSONで保存できる値の種類や、関数やコードを扱いたい場合の考え方について詳しく解説します。

JSONが扱える値の種類とは

JSONで利用できるデータ型は非常に限定されています。基本的には、文字列、数値、真偽値、null、配列、オブジェクトの6種類だけです。

例えば、以下のようなデータはJSONとして正しく扱えます。

{“name”:”太郎”,”age”:20,”active”:true,”skills”:[“JavaScript”,”PHP”]}

これらはすべて情報を表現しているだけであり、何か処理を実行する命令は含まれていません。

JSONでは関数を直接値として保持できない

JSONの仕様では、関数は値として定義されていません。そのため、JavaScriptのような関数定義をJSON内に記述することはできません。

例えばJavaScriptでは、以下のような関数を作成できます。

function greet(){ return “Hello”; }

しかし、この関数をそのままJSONの値として保存することはできません。JSONには「実行可能な処理」という概念が存在しないためです。

関数のような文字列をJSONに保存することは可能

JSONでは関数そのものは保存できませんが、関数のコードを文字列として保存することは可能です。

例えば、以下のようなJSONは構文上は有効です。

{“function”:”function(){ return 1; }”}

ただし、この場合保存されているのは単なる文字列です。JSONを読み込んだだけでは、この文字列が自動的に関数として実行されることはありません。

JavaScriptではeval()やFunctionコンストラクタなどを使って文字列をコードとして実行する方法もありますが、外部から取得したデータを実行するとセキュリティ上の危険があるため、通常のアプリケーション開発では避けるべきです。

JSONとプログラムコードを分けて管理する理由

JSONがデータだけを扱う設計になっているのには理由があります。JSONは異なるプログラムやシステム間で安全に情報を受け渡すために作られた形式だからです。

もしJSON内に自由なプログラムコードを含められると、データを読み込んだだけで意図しない処理が実行される危険があります。そのため、JSONはあえて実行機能を持たないシンプルな形式になっています。

例えばユーザー情報をJSONで送信する場合、「ユーザー名」や「権限」といった情報だけを渡し、実際の処理は受け取った側のプログラムが担当します。

JSONで処理内容を表現したい場合の一般的な方法

アプリケーションによっては、JSONを使って処理内容を指定したい場合があります。その場合は、関数そのものではなく、処理を表すデータを保存する方法がよく使われます。

例えば、以下のように処理名を保存する方法があります。

{“action”:”send_email”,”target”:”user@example.com”}

プログラム側では、このactionの値を確認して対応する処理を実行します。この方法ならJSONは安全なデータ形式のまま利用できます。

JavaScriptのオブジェクトとJSONの違い

初心者が混同しやすいポイントとして、JavaScriptのオブジェクトとJSONは別物です。

JavaScriptのオブジェクトには、関数をプロパティの値として持たせることができます。

例えば以下はJavaScriptでは有効です。

const user = { name: “太郎”, hello: function(){ console.log(“こんにちは”); } };

一方で、このオブジェクトをJSON形式に変換すると、関数部分は削除されます。JSON.stringify()を使った場合、関数やundefinedなどJSONで表現できない値は変換対象外になります。

まとめ

JSONでは、関数の定義や実行可能なプログラムコードを直接値として保持することはできません。

JSONが扱えるのは文字列、数値、真偽値、null、配列、オブジェクトなどのデータだけであり、処理命令を保存する形式ではありません。

もし処理内容を保存したい場合は、関数コードではなく処理名や設定情報をJSONに保存し、実際の処理はプログラム側で実行する設計にするのが一般的です。JSONの役割を正しく理解することで、安全で管理しやすいシステムを構築できます。

コメント

タイトルとURLをコピーしました