Тест регулярных выражений в jQuery parseJSON возвращает false - почему? - PullRequest
2 голосов
/ 19 февраля 2010

Я не понимаю, почему тест в функции jQuery parseJSON:

/^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
            .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
            .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))

возвращает false для строки: {"TermTitle":"some Title"}
Тест в http://www.jsonlint.com/ говорит мнечто строка {"TermTitle":"some Title"} является допустимой JSON, но когда я пытаюсь передать ее в $.parseJSON(opData), функция parseJSON завершается ошибкой ...
Я также протестировал только эту функцию /^[\],:{}\s]*$/.test... отдельно в Firebug с указанной строкой.

[править] Хорошо, код:

var json = '{"TermTitle":"some Title"}';  
var obj = $.parseJSON(json);  
alert('obj = ' + obj + ' and obj.TermTitle = ' + obj.TermTitle);

работает и для меня.

Но в моем случае, когда у меня есть следующее в моем JavaScript:

function GetTerm($iInd) {  
    $.ajax({  
        type: "POST",  
        url: "get_term.php",  
        data: {  
            id: $iInd  
        },  
        success: function(data){  
            ProcessFetchedTerm(data);  
        }  
    });  
    //If I tried adding dataType: "json" then it would stop working at all.
}  

function ProcessFetchedTerm(opData) {  
    alert ("In ProcessFetchedTerm, data: '" + opData + "'");  
    alert ("typeof opData: " + typeof opData);  

    alert ("Replacement result of the regex function: " +  
      opData.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").  
          replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").  
          replace(/(?:^|:|,)(?:\s*\[)+/g, ''));  

    alert ("Result of the regex function: " +  
      /^[\],:{}\s]*$/.  
          test(opData.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").  
          replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").  
          replace(/(?:^|:|,)(?:\s*\[)+/g, '')));  

    var oTerm = $.parseJSON(opData);  
    alert('oTerm = ' + oTerm + ' and oTerm.TermTitle = ' + oTerm.TermTitle);  
}  

и в get_term.php у меня есть:

echo json_encode(  
    array(  
        "TermTitle"=>"some Title"  
    )  
);  

Возврат оповещений:
In ProcessFetchedTerm, data: '{"TermTitle":"some Title"}'
typeof opData: string
Replacement result of the regex function: {]:]}
Result of the regex function: false
Последнее предупреждение не отображается

[править 2]

Я переписал начало своей функции ProcessFetchedTerm на

function ProcessFetchedTerm(opData) {  

    var json = '{"TermTitle":"some Title"}';  
    alert ("In ProcessFetchedTerm, opData: '" + opData + "' json: '" + json + "'");  

    var oTerm = $.parseJSON(json);  

, предупреждение выдает:

In ProcessFetchedTerm, opData: '{"TermTitle":"some Title"}' json: '{"TermTitle":"some Title"}'  

Таким образом, строки равны, и если следующая строкаvar oTerm = $.parseJSON(json); это работает, но если следующая строка var oTerm = $.parseJSON(opData);, это не работает.

Так что же может быть скрыто внутри (предположительно) строкового объекта opData, что мешает ему работать?

Ответы [ 2 ]

1 голос
/ 19 февраля 2010

Запуск этого кода:

var json = '{"TermTitle":"some Title"}';
var obj = $.parseJSON(json);
alert('obj = ' + obj + ' and obj.TermTitle = ' + obj.TermTitle);

у меня работает (с jQuery 1.4). Проблема должна быть в другом месте вашего кода. Каков точный код, который вы запускаете, когда метод parseJSON дает сбой?

Редактировать (ответ на опубликованный код): Почему вы делаете функциональность вашего 3-го и 4-го оповещения? Я предполагаю, что это меняет ваше opData значение. Попробуйте добавить свое первое предупреждение прямо перед вашим parseJSON вызовом и посмотрите, что там.

0 голосов
/ 19 февраля 2010

Возвращает «ложь», потому что не совпадает. Вызовы replace преобразуют эту строку JSON в `{]:]} ', которая не соответствует регулярному выражению.

[править] о, да, да, оно совпадает; ну, я не знаю, в чем твоя проблема. Почему вы думаете, что он возвращает «ложь»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...