99

Web サイトの JSON 応答の一部には、次のものがありました (... コンテキストのために追加):

{..., now:function(){return(new Date).getTime()}, ...}

匿名関数を JSON に追加することは有効ですか? 「time」にアクセスするたびに、異なる値が返されると思います。

4

11 に答える 11

103

いいえ。

JSON は、純粋にデータ記述言語であることを意図しています。http://www.json.orgに記載されているように、これは「軽量データ交換フォーマット」です。- プログラミング言語ではありません。

http://en.wikipedia.org/wiki/JSONによると、サポートされている「基本型」は次のとおりです

  • 数値 (整数、実数、または浮動小数点)
  • 文字列 (バックスラッシュでエスケープされた二重引用符で囲まれた Unicode)
  • ブール値 (true および false)
  • 配列 (カンマで区切られ、角括弧で囲まれた順序付けられた値のシーケンス)
  • オブジェクト (キーと値のペアのコレクション、カンマで区切られ、中かっこで囲まれています)
  • null
于 2010-01-04T19:05:28.917 に答える
16

問題は、データ定義言語としての 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 標準に含まれる予定です。

于 2010-01-04T19:33:33.040 に答える
10

仕様の 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を介して関数をトンネリングしない」フラグを立てる準備をしてください。

于 2015-01-05T13:14:26.307 に答える
7

私の知る限り、標準ではありません。http://json.org/をざっと見てみると、これが確認できます。

于 2010-01-04T19:03:51.480 に答える
4

JSON は、JavaScript のみのデータ構造を意図したものではないため (名前に JS が含まれているにもかかわらず)、関数を明示的に除外します。

于 2010-01-04T19:04:43.753 に答える
4

いいえ、絶対に違います。

適切な JSON シリアライザを使用すると、そのような関数をシリアライズできなくなります。これは有効な OBJECT ですが、有効な JSON ではありません。その Web サイトの意図が何であれ、有効な JSON を送信していません。

于 2010-01-04T19:08:11.390 に答える
-5

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>
于 2019-01-30T14:54:29.757 に答える
-6

引用符をオフのままにします...

var a = {"b":function(){alert('hello world');} };

a.b();
于 2015-11-16T22:44:41.160 に答える