Web サイトの JSON 応答の一部には、次のものがありました (... コンテキストのために追加):
{..., now:function(){return(new Date).getTime()}, ...}
匿名関数を JSON に追加することは有効ですか? 「time」にアクセスするたびに、異なる値が返されると思います。
Web サイトの JSON 応答の一部には、次のものがありました (... コンテキストのために追加):
{..., now:function(){return(new Date).getTime()}, ...}
匿名関数を JSON に追加することは有効ですか? 「time」にアクセスするたびに、異なる値が返されると思います。
いいえ。
JSON は、純粋にデータ記述言語であることを意図しています。http://www.json.orgに記載されているように、これは「軽量データ交換フォーマット」です。- プログラミング言語ではありません。
http://en.wikipedia.org/wiki/JSONによると、サポートされている「基本型」は次のとおりです。
null
問題は、データ定義言語としての JSON が JavaScript Object Notation としての JSON から発展したことです。JavaScript は JSON での評価をサポートしているため、JSON コードを JSON 内に配置することは正当です (そのユースケースでは)。JSON を使用してデータをリモートで渡す場合、JSON にメソッドを配置するのは悪い習慣だと思います。クライアントとサーバーのやり取りをうまくモデル化していない可能性があるからです。さらに、JSON をデータ記述言語として使用したい場合、メソッドを埋め込むことで問題が発生する可能性があると言えます。JSON パーサーの中には、データ記述のみを念頭に置いて作成され、構造内のメソッド定義をサポートしていないものがあるためです。
ウィキペディアの JSON エントリは、セキュリティ上の懸念を理由に、JSON にメソッドを含めないことの良い例です。
テキストのソースを完全に信頼しており、JSON に厳密に準拠していないテキストを解析して受け入れる必要がある場合を除き、eval() を避けて、代わりに JSON.parse() または別の JSON 固有のパーサーを使用する必要があります。JSON パーサーは JSON テキストのみを認識し、悪意のある JavaScript を含む可能性のある他のテキストを拒否します。ネイティブ JSON サポートを提供するブラウザーでは、JSON パーサーも eval よりもはるかに高速です。ネイティブ JSON サポートは、次の ECMAScript 標準に含まれる予定です。
仕様の 1 つを引用しましょう - https://www.rfc-editor.org/rfc/rfc7159#section-12
The JavaScript Object Notation (JSON) Data Interchange Format Specification には次のように記載されています。
JSON は JavaScript のサブセットですが、割り当てと呼び出しは除外されます。
JSON の構文は JavaScript から借用されているため、その言語の「eval()」関数を使用して JSON テキストを解析することができます。 テキストにはデータ宣言とともに実行可能なコードが含まれる可能性があるため、これは一般に容認できないセキュリティ リスクとなります
。
JSON テキストがその言語の構文に準拠している他のプログラミング言語で eval() のような関数を使用する場合にも、同じ考慮事項が適用されます。
したがって、関数がJSON標準の一部ではないというすべての回答は正しいです。
公式の答えは:いいえ、JSON の結果で関数を定義することは有効ではありません!
「コードはデータであり」、「データはコードである」ため、答えはイエスかもしれません。JSON が言語に依存しないデータのシリアル化形式として使用されている場合でも、他の型を介した「コード」のトンネリングは機能します。
JSON 文字列を使用して、JS 関数をクライアント側のブラウザーに渡して実行することができます。
[{"data":[["1","2"],["3","4"]],"aFunction":"function(){return \"foo bar\";}"}]
これは、「https://stackoverflow.com/questions/939326/execute-javascript-code-stored-as-a-string」の方法のような質問につながります。
「eval()は悪です」フラグを立て、その横に「JSONを介して関数をトンネリングしない」フラグを立てる準備をしてください。
私の知る限り、標準ではありません。http://json.org/をざっと見てみると、これが確認できます。
JSON は、JavaScript のみのデータ構造を意図したものではないため (名前に JS が含まれているにもかかわらず)、関数を明示的に除外します。
いいえ、絶対に違います。
適切な JSON シリアライザを使用すると、そのような関数をシリアライズできなくなります。これは有効な OBJECT ですが、有効な JSON ではありません。その Web サイトの意図が何であれ、有効な JSON を送信していません。
although eval is not recommended, this works:
<!DOCTYPE html>
<html>
<body>
<h2>Convert a string written in JSON format, into a JavaScript function.</h2>
<p id="demo"></p>
<script>
function test(val){return val + " it's OK;}
var someVar = "yup";
var myObj = { "func": "test(someVar);" };
document.getElementById("demo").innerHTML = eval(myObj.func);
</script>
</body>
</html>
引用符をオフのままにします...
var a = {"b":function(){alert('hello world');} };
a.b();