2012-01-24 3 views
4

У меня есть результат в формате JSON, отправленный обратно клиенту, который содержит знак $. по какой-то неизвестной причине код ломается.Метод декодирования ExtJS не может быть декодирован «& quot; После загрузки файла

Вот код, который кирпичи из доб-все-отладки:

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, отправляется в типе содержимого текста/HTML, поскольку это является результатом операции загрузки файла. может ли это быть частью проблемы?

Хорошо, я продолжал отслеживать вниз проблему и обнаружил, что ExtJS делает эту функцию на возвращаемом значении из скрытого фрейма:

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 действителен. Я бы опубликовал это на форуме EXT сайта Sencha.com. Это звучит как ошибка. –

+0

Можете ли вы просмотреть ответ в чем-то вроде Firebug, чтобы убедиться, что строка JSON правильно возвращается с сервера? – RoccoC5

+0

FWIW: JSON недействителен. Все ключи должны быть указаны. Не то, что это важно при использовании 'eval()' ... – user123444555621

ответ

4

Вот как я работал вокруг него.

Проблема заключалась в том, что все браузеры автоматически декодируют & quot; знаки.

Так что я установил функцию 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) {} 

     ... 
} 

В дополнение отныне по типу контента, сервер возвращается в «текст/обычный» это предотвращает браузеры от декодирования данных. Я также добавил небольшое обходное решение из FF, которое не поддерживает свойство innerText, но добавляет тег, который обертывает ответ.

Это уродливое взломать конструкцию ExJS, но это сработало для меня.

Надеюсь, кто-то заметит этот вопрос и предложит лучшую идею о том, как его решить.

2

Он не похож на кодированную цитату вызывает проблему - посмотри на этой jsfiddle, чтобы видеть, что функция Ext.decode отлично работает при декодировании строки JSON, содержащей &quot;:

http://jsfiddle.net/MXVvR/

Вы уверены, что сервер возвращает строку JSON, а не объект JSON? Осмотрите ответ сервера с помощью Firebug, Fiddler или Chrome Developer Tools, чтобы точно узнать, что возвращается с сервера.

+1

, так что это означает, что то, что сервер якобы возвращает, не является тем, что, по моему мнению, возвращается. Это означает, что " как-то декодируется до того, как он достигнет клиента. – AMember

+0

Сервер ответил отлично, проблема заключалась в том, что браузер получил ответ от скрытого тела ifram с собственностью innerHTML (так ребята из Extjs реализовали его) и quot; там расшифрован. см. мою работу ... – AMember

 Смежные вопросы

  • Нет связанных вопросов^_^