2012-01-24 3 views
4

JSONフォーマットの結果がクライアントに返送され、$ quotサインを保持しています。いくつかの未知の理由のために、コードが壊れます。ここでファイルをアップロードした後にExtJSデコードメソッドが "&quot"デコードに失敗する

がext-すべてのデバッグからそのレンガコードです:それは、サーバーを残したとして、ここでは

doDecode = function(json){ 
    return eval("(" + json + ")"); FAILS HERE 
}, 

は、私は、サーバーが時間がかかることはありません願って、私の知る限りでは(私のJSONですその自由な時間に、この& QUOTをデコードする):。それは、ファイルのアップロード操作の結果であるとして

{ 
success: true, 
total: 1, 
results: [{ 
    "ID": -1, 
    "Value": "POChangeRequestlblCustomerCatalogNumber", 
    "Description": "", 
    "Labels": { 
     "1": { 
      "ID": -1, 
      "LanguageID": 1, 
      "Value": "Catalog Number", 
      "ToolTip": "", 
      "LanguageName": "English", 
      "KeyID": -1, 
      "KeyValue": "POChangeRequestlblCustomerCatalogNumber", 
      "KeyDescription": "" 
     }, 
     "2": { 
      "ID": -1, 
      "LanguageID": 2, 
      "Value": "&quot;", <<< THIS IS THE BAD PART!!! 
      "ToolTip": "", 
      "LanguageName": "Hebrew", 
      "KeyID": -1, 
      "KeyValue": "POChangeRequestlblCustomerCatalogNumber", 
      "KeyDescription": "" 
     } 
    }, 
    "ServerComments": "1" 
}] 
} 

このJSONはtext/htmlのコンテンツ・タイプで送信されます。それは問題の一部になる可能性がありますか?

[OK]を、私は問題をダウン追跡し続け、ExtJSには、非表示のiframeから返された値でこの機能を行うことを見出した:

doFormUpload : function(o, ps, url){ 
     ... 

      try{ 
       doc = frame.contentWindow.document || frame.contentDocument || WINDOW.frames[id].document; 
       if(doc){ 
        if(doc.body){ 
         if(/textarea/i.test((firstChild = doc.body.firstChild || {}).tagName)){ 
          r.responseText = firstChild.value; 
         }else{ 
          r.responseText = doc.body.innerHTML; << THIS IS WHERE MY &quot; get decoded back to " (sign) 
         } 
        } 

        r.responseXML = doc.XMLDocument || doc; 
       } 
      } 
      catch(e) {} 

      ... 
    } 

この問題のために良い回避策があります。ブラウザは自動的に値????をデコードするようです誰でも????これは大きな問題です!

+0

JSONが有効です。私はSencha.comサイトのEXTフォーラムでこれを投稿したいと思います。これはバグのように思えます。 –

+0

JSON文字列がサーバーから正しく返されていることを確認するために、Firebugのようなレスポンスを表示できますか? – RoccoC5

+0

FWIW:JSONが無効です。すべてのキーを引用符で囲む必要があります。 'eval()'を使うときは重要ではありません... – user123444555621

答えて

4

ここで私はそれを回避した方法です。

問題はすべてのブラウザが自動的に&をデコードすることでした。サイン。

だから私はこのように見えるのExt doFormUpload機能を固定している:サーバーが戻っていることをコンテンツタイプになりましたから、また

doFormUpload : function(o, ps, url){ 
    ... 

     try{ 
      doc = frame.contentWindow.document || frame.contentDocument || WINDOW.frames[id].document; 
      if(doc){ 
       if(doc.body){ 
        if(doc.body.innerText){ 
          r.responseText = doc.body.innerText; 
         }else{ 
          r.responseText = doc.body.innerHTML.replace(/<pre>/ig,'').replace(/<\/pre>/ig,''); 
         } 
       } 

       r.responseXML = doc.XMLDocument || doc; 
      } 
     } 
     catch(e) {} 

     ... 
} 

text/plainの」ある これはブラウザを防ぎますデータの復号化から また、FFから少しの回避策を追加しましたが、innerTextプロパティをサポートしていませんが、応答をラップするタグを追加しました。

これはExJSフレームワークの醜いハックですが、それは私のために働きました。

うまくいけば、誰かがその質問に気付き、それを解決する方法についていくつかの良いアイデアがあることを望みます。

2

エンコードされた引用はあなたの問題を引き起こしているようにそれは見ていません - &quot;を含むJSON文字列をデコードする際Ext.decode機能が完全に正常に動作することを確認するには、このjsfiddleを見てみましょう:

http://jsfiddle.net/MXVvR/

サーバーがJSONオブジェクトではなくJSON文字列を返していますか? Firebug、Fiddler、またはChromeデベロッパーツールを使用してサーバーの応答を調べ、サーバーから戻ってくるものを正確に確認します。

+1

これは、サーバが返すものとは私が返すとは思わないことを意味します。これは、"が何らかの形でクライアントに到達する前にデコードされていることを意味します。 – AMember

+0

サーバが完全に応答しました。問題は、ブラウザーが内部HTMLプロパティー(これはExtjsのユーザーがどのように実装したか)と引用符で囲まれたiframe本体からの応答を得たことでした。そこで解読されました。私の仕事を見て... – AMember