14

私はこのC#オブジェクトを持っています:

var obj = new {
    username = "andrey",
    callback = "function(self) { return function() {self.doSomething()} (this) }"
}

ajax呼び出しでブラウザーに渡すには、JSONシリアル化する必要があります。JavascriptSerializerを使用していますが、次のJSONにシリアル化されます。

{"username":"andrey", "callback": "function(self) { return function() {self.doSomething()} (this) }"}

しかし、私が必要としているのは:

{"username":"andrey", "callback": function(self) { return function() {self.doSomething()} (this) }}
  • 関数定義を引用符で囲みません。

現在、JSONオブジェクトがブラウザーに到達して作成されると、「callback」パラメーターは関数ではなく文字列になります。できればサーバー側で修正する方法はありますか?

4

3 に答える 3

23

私は似たようなことを成し遂げようとしていました。私の場合、MVC Razor構文を使用して、@<text>構文を使用して渡された関数でjsonオブジェクトを生成しようとしていました。

Json.netライブラリを使用して(JsonConvertとJRawを使用して)目的の出力を取得できました。

例:

// set the property value using JRaw
var obj = new {
    username = "andrey",
    callback = new JRaw("function(self) { return function() {self.doSomething()} (this) }")
}
// and then serialize using the JsonConvert class
var jsonObj = JsonConvert.SerializeObject(obj);

これにより、(文字列内の関数ではなく)関数を含むjsonオブジェクトが取得されます。

投稿: 関数をjsonにシリアル化する方法(razor @ <text>を使用)

于 2013-05-28T20:04:27.130 に答える
7

この動作は意図的なものです。JSONには、データ以外のもの(この場合は実行可能関数)を含めないでください。データがJSON形式でサーバーから返され、実行されると任意の機能(情報を盗んだり、ユーザーを悪意のあるサイトにリダイレクトしたりする可能性がある)を実行できる場合、ブラウザーは大きなセキュリティリスクにさらされます。

JSONの初期の実装は、返されたデータをeval()を介して実行するだけで、オブジェクトを取り戻すことができるという事実に依存しています。しかし、人々はこれが巨大なセキュリティリスクを引き起こすことにすぐに気づき、それ以来それを処理しようとしています。そのため、標準化されたJSONオブジェクトが登場する前は、生のJSONデータをeval()に入れるのをやめ、代わりにJSON解析ライブラリを使用していました。

JSONオブジェクトは、常にオブジェクトをデータのみにシリアル化します。これは仕様によるものです。標準化されたJSON形式には、実行可能関数を表す方法がありません。

これで、ブラウザ上のそのコールバックをeval()に渡すことで、関数に簡単に変換できます。ただし、それをしないでください。あなたはハッキングのために自分自身を開いているだけです。

サーバー側では、最新のブラウザーは、この正確な事態が発生しないように設計されています。つまり、実行可能関数を含むブラウザーからデータが送信されます。

于 2011-03-21T03:41:47.090 に答える
0

Functionオブジェクトのコンストラクターを利用できます。https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Functionを参照してください。

jsonで、コールバックプロパティを関数コンストラクターパラメーターを記述する文字列配列に設定します。次に、jsonデータがクライアントに到着したら、配列をFunctionオブジェクトのインスタンスに変換する必要があります。

このようにして、ソースコードにハードコーディングする代わりに、バックデータベースに関数の実装の詳細を含めることができます。

const json = '{"username":"andrey","callback":["self","return self.doSomething()"]}';

//Parse the json to an object
const object = JSON.parse(json);

//Convert the callback property from Array to Function
object["callback"] = new Function(...object["callback"]);

//Create a parameter for calling the Function
var self = {
    doSomething() {
        console.log("Do something called");
    }
}

//Call the function
object["callback"](self);
于 2020-04-21T10:35:55.363 に答える