5

jQuery の ajax 関数を使用して、クロス ドメインの URL にアクセスしています。URL は json を返します。私はこれで発見段階にいますが、json 値に複数の「"」文字列が含まれているため、json eval がエラーをスローし、クライアント側スクリプトの実行を停止していると思います。私が得るエラーは「未終了の文字列リテラル」です。返された json をローカル div に入れてハードコーディングし、「"」を削除すると、文字列 (およびいくつかの非表示の特殊文字) を使用すると、json を正常に評価できます。回避策であろうと、コードの修正であろうと、URL から json を取得し、有効な json オブジェクトとしてクライアント側の JavaScript に保存するにはどうすればよいですか?

私の現在のコード。定義された関数 (success、complete、error、dataFilter) のいずれも実行されません:

$(function() {
  $.ajax({
  url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", 
  dataType: "jsonp",
  success: successFunc,
  complete: completeFunc,
  error: errorFunc,
  dataFilter: dataFilterFunc
});

});

function successFunc() { console.log('successFunc(). enter.'); }
function completeFunc() { console.log('complete(). enter.'); }
function errorFunc() { console.log('errorFunc(). enter.'); }
function dataFilterFunc(data, type) { 
  data.replace(/\W/g, ' ');
  return data; 
}
4

5 に答える 5

3

問題は JSONP サービスで、callbackパラメーターを完全に無視しています。

JSONP 応答callbackは、 get パラメーターを関数名として使用した単純な関数呼び出しです。

JSONP サービスの応答を見ると、次のようになっているはずです。

http://somesite.com/jsonp?callback= myCallback

戻ります:

myCallback({/*json*/});

投稿したものはプレーン な有効なJSONを返していますが、 JSONP応答として処理することはできません。

于 2009-11-28T05:27:11.883 に答える
1

うーん。jQuery はわかりませんが、JSON は知っています。(私はそのための C++ ベースのパーサーを書きました。) 私はあなたが示す URL に行きました: http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?. Python の JSON パーサーはそれを受け入れます。私の経験では、Python の JSON パーサーは正しいです。これに注意してください:

{ "blah": "string " More more more" }

...有効な JSON です。この"部分は、JSON で特別に解釈されることはありません。文字列内の単なる文字です。


編集:これを詳しく見てみると、これを生成しているものは何でも、すべてではなく、いくつかのスラッシュをエスケープしていることは非常に興味深いと思います。"Start" 項目は "/Date(-XXXXX)/" で、これは/Date(-XXXXX)/JSON の / のテキストで、オプションでエスケープできます。ただし、キーが「SpeakerURI」と「URI」の項目ではエスケープされません。


編集: C++ ベースのパーサーでこれを実行しました。最初はかかりませんでしたが、実際にはこの JSON によってパーサーのバグが露呈しました。

于 2009-11-28T04:25:38.507 に答える
0

クライアント側のソリューションに近づいているようには見えません。jQuery-jsonp を使用するようにコードを変更しました。次のようになります。

$(function() {
  $.jsonp({
  url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", 
  async: false,
  dataType: "jsonp",
  success: successFunc,
  complete: completeFunc,
  error: errorFunc,
  dataFilter: dataFilterFunc
});

});

function successFunc(json, textStatus) { 
  console.log('successFunc(). enter.'); 
}
function completeFunc(xOptions, textStatus) { 
  console.log('complete(). textStatus: ['+textStatus + ']'); 
}
function errorFunc(xOptions, textStatus) { 
  console.log('errorFunc(). textStatus: [' + textStatus + ']'); 
}
function dataFilterFunc(j) { 
  console.log('dataFilterFunc(). enter.');
  return j; 
}

Firebug のコンソール ログには次のように表示されます。

X unterminated string literal
[{"URI"..... ( the json returned from the server
errorFunc(). textStatus: [error]
complete(). textStatus: [error]

なんらかの理由で、私の Firefox ブラウザー (FF v3.0.15、Linux Ubuntu 9.0.4) での json 解析は、「未終了の文字列リテラル」例外をスローしています。'Maintainable ASP.NET MVC' ブロック内の '& quo t' 文字列と 2 つの文字を削除すると、json が正常に解析されることはわかっています。サーバー側では制御できないため、最終的にサーバーのjson文字列をそのままクライアント側のjsonオブジェクトに取得するクライアント側のjavascriptでできることはありますか。jsonp の dataFilter プロパティは、json をインターセプトして「スクラブ」するために、まさにその目的のために設定されていると思いました。ただし、おそらく dataFilterFunc 関数に渡された json が正常に解析されないため、コード内のその関数は呼び出されません。

于 2009-11-28T19:12:05.153 に答える
0

jQuery の jsonp 処理に関するいくつかの問題を修正する jquery-jsponp プラグインを試すことを検討してください。

http://code.google.com/p/jquery-jsonp/

私はそれを使用しており、素晴らしい例がたくさんあります。

何が起こっているのかを確認できるように、コールバックを機能させる必要があります。


更新: jsonp を試してみたところ、予期しないトークン エラーが発生しました。理由はわかりませんが、URL から手動でデータを取得し、それをコンソールの JavaScript 変数に割り当てることができます。これで問題ありません。

于 2009-11-28T04:34:35.570 に答える
0

1時間かけてデータを分析した後、

私は次のことを見つけました

{
   "URI":"/rest/sessions/Maintainable-ASPNET-MVC",
   "Title":"Maintainable ASP.NET MVC",
   "Abstract":".....\u003e\u2028Duration: 60-90 minutes\u003cbr\u003e\u2028Subject Area: development....."
}

Duration の前に char \u2028 があり、サブジェクト エリア、

\u2028 は行区切り文字なので、その意味は \n のようなものなので、引用符 "" の間に改行があります。これがルート ケースである可能性があります。

それを削除すると、firebug に未終了の文字列リテラルが表示されなくなります。

それをテストするには、アドレスバーに次のように貼り付けます.FirefoxとOperaは失敗しますが、IE8とChromeは動作しています.

javascript:alert(eval('[{"Abstract":"\u003e
    Duration: 60-90 minutes\u003cbr\u003e
    Subject Area: development."}]'))

誰かがすでにそれについてブログを書いています

http://bulknews.typepad.com/blog/2009/02/json-jquery-and-some-unicode-characters-u2028.html

于 2009-11-28T06:03:51.630 に答える