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

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

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

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

Вот мой JSON в том виде, в котором он был отправлен с сервера (насколько я знаю, я надеюсь, что сервер не будет тратить время на декодирование этого "в свободное время"):

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

Хорошо, я продолжил отслеживать проблему и обнаружил, что 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) {}

            ...
    }

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


person AMember    schedule 24.01.2012    source источник
comment
Ваш JSON действителен. Я бы разместил это на форуме EXT сайта Sencha.com. Это похоже на ошибку.   -  person Diodeus - James MacFarlane    schedule 24.01.2012
comment
Можете ли вы просмотреть ответ в чем-то вроде Firebug, чтобы убедиться, что строка JSON правильно возвращается с сервера?   -  person RoccoC5    schedule 24.01.2012
comment
FWIW: JSON недействителен. Все ключи должны быть указаны. Не то чтобы это имело значение при использовании eval()...   -  person user123444555621    schedule 24.01.2012
comment
этот JSON отправляется с типом содержимого text/html, поскольку он является результатом операции загрузки файла. это может быть частью проблемы?   -  person AMember    schedule 25.01.2012
comment
Я не могу просмотреть ответ в Firebug, так как он по какой-то причине не показывает его при создании файла.   -  person AMember    schedule 25.01.2012
comment
Мне удалось просмотреть ответ сервера в инструментах разработчика Chrome, вот он: {успех: правда, всего: 1, результаты: [{ID: -1, значение: POChangeRequestlblCustomerCatalogNumber, Описание:, Метки: {1: {ID: - 1,LanguageID:1,Value:Catalog Number,ToolTip:,LanguageName:English,KeyID:-1,KeyValue:POChangeRequestlblCustomerCatalogNumber,KeyDescription:},2:{ID:-1,LanguageID:2,Value:,ToolTip:,LanguageName :Hebrew,KeyID:-1,KeyValue:POChangeRequestlblCustomerCatalogNumber,KeyDescription:}},ServerComments:1}]} мне нравится.   -  person AMember    schedule 25.01.2012
comment
Это очень поздний ответ, но я публикую его только для завершения ответа. Согласно Secha Doc для формы отправить , символы HTML декодируются в их литералы еще до того, как Ext встречает ответ (как вы уже догадались в комментарии ниже). Решение в моем другом комментарии   -  person Sathish    schedule 10.01.2018
comment
Три способа исправить это: 1) изменить тип содержимого ответа, чтобы браузер не мог автоматически декодировать символы html 2) заменить на другую последовательность символов и заменить ее вручную кавычками в вашем коде или 3) в вашем json, для ключа значения заключите значение в одинарные кавычки вместо двойных кавычек: P   -  person Sathish    schedule 10.01.2018


Ответы (2)


Вот как я работал над этим.

Проблема заключалась в том, что все браузеры автоматически расшифровывали " приметы.

Поэтому я исправил функцию 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, но он сработал для меня.

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

person AMember    schedule 25.01.2012

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

http://jsfiddle.net/MXVvR/

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

person RoccoC5    schedule 24.01.2012
comment
Итак, это означает, что то, что якобы возвращает сервер, не является тем, что я думаю, что он возвращает. Это означает, что файл каким-то образом декодируется до того, как он достигнет клиента. - person AMember; 25.01.2012
comment
Сервер ответил отлично, проблема была в том, что браузер получил ответ от скрытого тела iframe с свойство innerHTML (так это реализовали ребята из Extjs) и quot; там расшифровали. посмотри на мою работу... - person AMember; 25.01.2012