4

次のようなJSONのようなデータ構造を返すWebサイトがあります。

{
    "name":"tom jones",
    "no": 123,
     "storedproc": function(){
                      callbuyer(0123);
                    }
}

$.ajax()dataType"JSON"を使用してこのデータを取得しています。残念ながら、$.ajax()データにfunction()が含まれているため、エラーコールバックを呼び出します。どうすればこれを正しく解析できますか?関数を変数に格納して、後で呼び出す必要があります。

4

6 に答える 6

7

これは単に合法的なJSONではありません(質問のタイトルからわかるように)公式のJSON構文を参照してください。実際のJSONの良いところは、呼び出しJSON.parseを安全にラップするものを使用できることです。eval

使用するevalこともできますが、アプリケーションのアーキテクチャを再検討し、実行しようとしていることを実行する他の方法を見つけることをお勧めします。

特に、サーバーに唯一の関数を返して0123もらい、特定の場合にどの関数が適用されるかをサーバーに通知するロジックをクライアントに保持させます(このシナリオでは、関数は次のようになりますcallbuyer)。

storedproc後での値である関数を呼び出したいと言うので、これは機能するはずです。この関数の本体にはそれへの呼び出しが含まれているためcallbuyer、クライアント側のスクリプトはそれが何でcallbuyerあるかを認識しています。秘訣は、サーバーが任意の制約のない関数を返送するのではなく、クライアントがアプリケーション全体に関する知識を使用して何らかの方法で利用できるデータを返送することです。

于 2012-07-19T07:52:25.693 に答える
4

サーバーが次のようにJSONを返すように調整できますか?

{"name":"tom jones",
  "no": 123,
 "storeprocFn": callbuyer,
 "arg": "0123"};

次に、コールバック関数は関数を呼び出してcallbuyer渡すことができますarg

于 2012-07-19T07:58:04.507 に答える
1

evalを使用して、文字列をjavascriptオブジェクトとして解釈します。ただし、JSONデータ型を使用することはできません。$.ajax呼び出しのdataTypeとして「text」を使用する必要があると思います。次に、次のようなことを行います。

var data = eval('(' + text + ')');

動作するはずです。もちろん、評価は悪です。しかし、それはあなたの問題を解決するでしょう。テキストに悪意のあるものがないことを保証できる限り(サニタイズされていない、ユーザーが入力したデータがない)、問題はありません。

于 2012-07-19T07:48:28.593 に答える
1

AFAIK、関数は使用時に省略JSON.stringifyされます。これは、完全なオブジェクト(プロパティとメソッド)のクローンを作成するために使用されることを意図したものではありません。ただし、関数本体を文字列として渡すことができる場合があります。
のような文字列形式を決定したとしますfunc=>var foo = 'bar'; return foo;。これは通常のJSON文字列として渡す必要があります。オブジェクトを解析した後、すべてのプロパティを繰り返し、それらの文字列を次のような関数に変換できます。

for (var prop in parsedObj)
{
    if (parsedObj.hasOwnProperty(prop) && parsedObj[prop].match(/^func\=\>/))
    {
        parsedObj[prop] = new Function(parsedObj[prop].replace('func=>',''));
    }
}

真剣に、あなたはあなたのアプローチを再考したいかもしれませんが、これはJSONの目的ではありません。安全ではありません。有害なコードが含まれていないことを確認した後、すべてのJSON文字列が評価されます。このアプローチは、JSONの人々が封印するために一生懸命働いた抜け穴/脆弱性を生み出しています。

于 2012-07-19T08:04:17.643 に答える
0

あなたの例では、これは機能します:'user.storeproc = function(){callbuyer(user.no);};'

Var'user'は、解析されたjsonのオブジェクトです。

追伸:多分あなたはuser.noを123から0123までフォーマットしなければなりません

于 2012-07-19T07:58:45.553 に答える
0

JSON拡張機能「JFON」に続いて、関数と配列プロパティの転送を行います。
JFONはevalを使用し、次の場合を対象としています。

1)データが信頼できるソースからのものである(ユーザー入力から派生していない、または独自のサーバーからのコードであるなど)、 2)「eval」 のコンテキスト(evalの
コンテキスト)に望ましくない副作用がないことがわかっている
関数「fromJFON」の127行目)
3)「関数のない」JSONを使用するようにアプリをリファクタリングするのはコストがかかります。
4)JFONは1日の作業であるため、さらにテストが必要になる場合があります。


アイデア:選択した文字 "\"を使用して\nと\を渡す場合は、選択したプロパティ名を使用して、文字列のように関数や配列をエスケープします。

JFONでは、関数とそれ自体を渡すために「wrap」という名前が選択されています。「wrap」:{「fun」:...および「wrap」:{「esc」:..。

デモ: http: //landkey.org/Sandbox/z/spaceen86/js/btb/tests/jfon.htm

コード(commit 0.0.86を使用):
https
://github.com/lancelab/spaceen/blob/master/js/btb/JFON.js テスト:github.com/lancelab/spaceen/blob/master/js/btb/ tests / jfon.htm


別の「JWON」拡張機能は次のとおりです。JSON-コメント、ヒアドキュメント、JSONのモンキーパッチ: github.com/lancelab/Boardspirator/blob/master/diary/play/tp/jwon.js

于 2013-10-18T18:31:26.310 に答える