ASP.NET WebMethod - отключение сериализации возвращаемого значения в JSON - PullRequest
0 голосов
/ 05 ноября 2011

Я использую JQuery и WebMethod для отправки и хранения строкового представления объекта JSON внутри моей базы данных.

Таким же образом у меня есть другой WebMethod, который должен получить пользовательские настройки из базы данных и вернуть их запрашивающему клиенту:

[WebMethod]
public static string GetUserSettings()
{
    FacebookWebContext currentFbContext = FacebookWebContext.Current;

    string encodedSettings = "{}";

    if (currentFbContext.IsAuthorized(ExtendedPermissions))
    {
        // Methods to fetch json back from the database into "encodedSettings"
    }

    return encodedSettings;
}

Все идет хорошо, но проблема в том, что когда я "нюхаю" http-ответ, ответ оборачивается так:

{"d":"my_stored_json_object_as_an_escaped_string"}, что было бы просто отлично, но так как тип возвращаемого значения был установлен на «строку», весь сохраненный json пропускается с символами «\» перед «» и другими управляющими символами, поэтому я не могу использовать это как объект javascript на стороне клиента.

Я пытался использовать что-то вроде этого:

        $.ajax({
            type: "POST",
            url: "Ajax/Default.aspx/GetUserSettings",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (usrSettingsObj) {
                var obj = eval(usrSettingsObj.d);
            }});

Но выдает ошибку.

есть идеи, как мне преодолеть эту проблему?

1 Ответ

1 голос
/ 05 ноября 2011

Я подозреваю, что проблема в том, что eval() рассматривает ваш JSON как объявление области вместо хеш-объекта.Простой способ обойти это - это

var obj = eval('('+usrSettingsObj.d+')');

Хотя я все же предпочел бы исправить ваше возвращаемое значение из веб-метода, чтобы оно было действительным JSON.затем опубликуйте свой фактический ответ, чтобы было легче понять, что происходит.

edit:

Как я уже сказал, eval() не понимает характер строки, которую вы дали.Он видит { и думает, что это открывающая скобка области видимости, а затем пытается оценить остальную часть как отдельные утверждения, которые, конечно, недействительны.По сути, требуется небольшая помощь, чтобы понять, что указанная вами строка является хеш-объектом.Вы можете сделать это, заключив в скобки, чтобы создать так называемый мягкий JSON, как я показал выше.Или вы можете переписать это как eval('obj = ('+usrSettingsObj.d+')');, что должно иметь тот же эффект.На самом деле в этом последнем случае вам даже не нужны скобки.Просто eval('obj = '+usrSettingsObj.d); должно работать.

Да, и самое важное: использование eval() для анализа JSON обычно вызывает недовольство.Вы должны использовать настоящий анализатор JSON всякий раз, когда можете.Я считаю, что у jQuery есть метод parseJSON().

...