Метод декодирования ExtJS не может декодировать "" "после загрузки файла - PullRequest
4 голосов
/ 24 января 2012

У меня есть результат в формате JSON, отправленный обратно клиенту со знаком $ quot. по какой-то неизвестной причине код ломается.

Вот код, который строится из ext-all-debug:

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 выполняет эту функцию для возвращаемого значения из скрытого 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) {}

            ...
    }

Есть ли хороший обходной путь для этой проблемы. похоже, что браузер автоматически декодирует значение ???? кто-нибудь???? это серьезная проблема !!

Ответы [ 2 ]

4 голосов
/ 25 января 2012

Вот как я обошел эту проблему.

Проблема заключалась в том, что все браузеры автоматически декодировали & 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) {}

        ...
}

Кроме того, теперь тип содержимого, возвращаемый сервером, - " text /plain"это предотвращает декодирование данных браузерами.Я также добавил небольшой обходной путь от FF, который не поддерживает свойство innerText, но добавляет тег, который оборачивает ответ.

Это уродливый хак для фреймворка ExJS, но он работал для меня.

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

2 голосов
/ 24 января 2012

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

http://jsfiddle.net/MXVvR/

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

...