Использование веб-службы Microsoft с помощью jQuery - PullRequest
0 голосов
/ 29 сентября 2010

Я пытаюсь использовать веб-сервис WCF, используя jQuery. Возвращенные данные Json:

{
    "ListOfPersons":
        "[
            {'Id':1,'FirstName':'Foo','LastName':'Bar'},
            {'Id':2,'FirstName':'Hello','LastName':'World'},
            {'Id':3,'FirstName':'Tanks','LastName':'Giving'},
        ]"
}

Вот функции, которые я использую в Jquery:

 var url = 'http://path/to/webservice.svc/ReturnTheList';
    $.getJSON(url, function (data) {
        success: readData(data)
    });

    function readData(data){
        alert(data.ListOfPersons[0].FirstName);
    }

Проблема в том, что предупреждение ничего не возвращает.

И, если я изменю Json на:

{
    "ListOfPersons":
        [
            {"Id":1,"FirstName":"Foo","LastName":"Bar"},
            {"Id":2,"FirstName":"Hello","LastName":"World"},
            {"Id":3,"FirstName":"Tanks","LastName":"Giving"},
        ]
}

(я заменил простые кавычки на двойные и удалил двойные кавычки перед [и после]).

Итак, я пришел к выводу, что это проблема с возвращенным форматом. Проблема в том, что я не могу изменить этот веб-сервис. Как я могу использовать "плохо отформатированную" структуру json?

Спасибо тебе,

Привет

EDIT:

Вот подпись веб-службы:

 [OperationContract]
        [WebInvoke(Method = "GET",
             BodyStyle = WebMessageBodyStyle.WrappedResponse,
             ResponseFormat = WebMessageFormat.Json)]
        string ReturnTheList();

Ответы [ 2 ]

4 голосов
/ 29 сентября 2010

Более новые версии jQuery (начиная с версии 1.4, я думаю) вообще не будут загружать недействительный JSON.

У вас есть два варианта: вы можете написать прокси на стороне сервера, который вызывает веб-сервис, анализирует неверный JSON и возвращает его в действительной форме, или вы можете использовать эту функцию (написано AlexСекстон , а не я!):

jQuery.getInvalidJSON = function(url, data, callback) {
    return jQuery.get(url, data, function(d){
        callback.call(this, (new Function('return (' + d + ')'))());
    }, "text");
};

Это в основном то же самое, что и ответ Дьюфи: выполнение небезопасного eval для строки JSON для получения пригодного для использования объекта. Убедитесь, что вы доверяете источнику , прежде чем использовать этот метод, так как будет выполнено все, что скрыто в JSON.

Редактировать : У меня было немного времени, чтобы на самом делепроверьте это и выясните, что в функции Алекса произошла небольшая ошибка.Строка JSON (переменная 'd') должна быть заключена в круглые скобки, чтобы быть оцененной как объект - я соответствующим образом отредактировал приведенный выше код.

В то время как приведенный выше загрузит JSON, который не совсем строго действительно (пропущены кавычки вокруг имен свойств, одинарные кавычки вместо двойных и т. Д.), У него есть свои ограничения.JSON, с которым вы работаете из этого веб-сервиса, просто сломан.

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

jQuery.getInvalidJSON = function(url, data, callback) {
    return jQuery.get(url, data, function(d){
        var cleaned = d.replace(/"\[/g, '[').replace(/\]"/g, ']');
        callback.call(this, (new Function('return (' + cleaned + ')'))());
    }, "text");
};

И назвать это так:

$.getInvalidJSON(url, null, readData);

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

0 голосов
/ 29 сентября 2010

Для получения желаемого просто используйте eval - чтобы преобразовать вторую часть пары в структуру данных jscript:

function readData(data){
    var subArr =  eval(data.ListOfPersons);
    alert(subArr[0].FirstName);
}
...