проблема с JSON и Eval - PullRequest
       34

проблема с JSON и Eval

1 голос
/ 19 ноября 2009

Кажется, я не могу найти никакого решения для этого в SO, так что вот так.

У меня есть вызов WebMethod в C # моей страницы, как это;

$.ajax({
    type: "POST",
    url: "MyWebPage.aspx/jQueryMyWebMethod",
    data: "{FamilyType:'" + $('.HdnFamilyType').val() + "'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        var obj = eval('(' + msg + ')');
    }
});

В коде позади я создаю объект, сериализую его и возвращаю так:

LHCRequiredFormViewModel fvm = new LHCRequiredFormViewModel();
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(LHCRequiredFormViewModel));
MemoryStream ms = new MemoryStream( );
ser.WriteObject(ms, fvm);
return Encoding.Default.GetString(ms.ToArray());

Однако в Javascript, когда я делаю eval, я получаю ошибку;

Ожидается ']';

В момент возврата сериализованного объекта из C # данные выглядят так;

"{\"<IsApplicantLHCRequired>k__BackingField\":true,\"<IsPartnerLHCRequired>k__BackingField\":false}"    string

Я должен упомянуть, что проект был .Net 2.0, и я просто возвращал сериализованный объект без всей болтовни JSON, и он работал нормально.

Итак, я перешел на 3.5, и проблема началась. Тогда я использовал JsonSerializer, но все равно получаю точно такую ​​же ошибку.

Кто-нибудь знает, что происходит и как это исправить?

Ответы [ 4 ]

0 голосов
/ 27 ноября 2009

С jQuery.ajax, когда вы используете json в качестве dataType, это означает «подтвердите это для меня, потому что это JSON», и аргументом вашего обратного вызова будет объект. Итак, у вас есть этот объект, который вы соединяете со строкой.

eval('(' + msg + ')');

Это приводит msg к строке, а приведение объекта к строке возвращает "[объект объекта]" для простого хеша, как у вас. Итак, с круглыми скобками вы получите:

"([object Object])"

Eval'ing - полная синтаксическая ошибка.

Как предполагает odge, либо отбросьте "eval", либо отбросьте "json" dataType.

0 голосов
/ 19 ноября 2009

Во-первых, я не уверен с C #

но не могли бы вы попытаться изменить ms.ToArray() на ms как

return Encoding.Default.GetString(ms);
0 голосов
/ 27 ноября 2009

Давным-давно у меня была проблема, похожая на эту. К сожалению, это было так давно, что я не могу вспомнить, как я все исправил. Я просто знаю, что основная причина была от старой версии .NET до 3.5.

Если память мне не изменяет, попробуйте следующее: Попробуйте использовать другой десериализатор на клиенте. Например, Json Parse от http://www.json.org/json_parse.js

Если это все еще не работает. Попробуйте другой сериализатор на сервере. Json.NET бесплатен и предоставляет большой контроль над тем, как вы хотите сериализовать ваши данные: http://www.codeplex.com/Json

Или, может быть, мне просто нужно было установить MimeType, чтобы запрос был только текстовым, а не HTML.

0 голосов
/ 19 ноября 2009

Хотя я не уверен на 100%, я считаю, что проблема в вашем сериализованном объекте.

    "{\"<IsApplicantLHCRequired>k__BackingField\":true,\"<IsPartnerLHCRequired>k__BackingField\":false}"

Вероятно, функция eval сбивается с толку \ "там. Вы пытались изменить это на '?

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