Как создать объект JSON для отправки на AJAX WebService? - PullRequest
15 голосов
/ 29 апреля 2010

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

[WebMethod]
public Response ValidateAddress(Request request)
{
    return new test_AddressValidation().GenerateResponse(
        test_AddressValidation.ResponseType.Ambiguous);
}

...

public class Request
{
    public Address Address;
}

public class Address
{
    public string Address1;
    public string Address2;
    public string City;
    public string State;
    public string Zip;
    public AddressClassification AddressClassification;
}

public class AddressClassification
{
    public int Code;
    public string Description;
}

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

Я не могу использовать функцию jQuery getJSON, потому что для запроса требуется HTTP POST, поэтому вместо этого я использую функцию ajax более низкого уровня:

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
    data: "{\"Address\":{\"Address1\":\"123 Main Street\",\"Address2\":null,\"City\":\"New York\",\"State\":\"NY\",\"Zip\":\"10000\",\"AddressClassification\":null}}",
    dataType: "json",
    success: function(response){
        alert(response);
    }
})

Функция ajax отправляет все, что указано в data:, и в этом моя проблема. Как построить правильно отформатированный объект JSON в javascript, чтобы я мог подключить его к своему вызову ajax следующим образом:

data: theRequest

В конце концов я буду извлекать данные из текстовых входов в формах, но сейчас жестко закодированные тестовые данные - это хорошо.

Как создать правильно отформатированный объект JSON для отправки в веб-службу?


ОБНОВЛЕНИЕ: Оказывается, проблема с моим запросом была не в форматировании JSON, как в T.J. указал, скорее, что мой текст JSON не соответствует требованиям веб-службы. Вот правильный JSON-запрос, основанный на коде в WebMethod:

'{"request":{"Address":{"Address1":"123 Main Street","Address2":"suite 20","City":"New York","State":"NY","Zip":"10000","AddressClassification":null}}}'

Это подняло еще один вопрос: Когда важна чувствительность к регистру в запросах JSON к веб-службам ASP.NET (ASMX)?

Ответы [ 7 ]

12 голосов
/ 29 апреля 2010

Ответ очень прост и основан на моих предыдущих сообщениях Могу ли я вернуть JSON из веб-службы .asmx, если ContentType не является JSON? и JQuery-вызов ajax для httpget webmethod (c #) не работает .

Данные должны быть в формате JSON. Вы должны отдельно кодировать каждый входной параметр. Поскольку у вас есть только один параметр, вы должны сделать следующее:

сначала создайте ваши данные как данные JavaScript, например:

var myData = {Address: {Address1:"address data 1",
                        Address2:"address data 2",
                        City: "Bonn",
                        State: "NRW",
                        Zip: "53353",
                        {Code: 123,
                         Description: "bla bla"}}};

затем передайте в качестве параметра запроса ajax {request:$.toJSON(myData)}

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
    data: {request:$.toJSON(myData)},
    dataType: "json",
    success: function(response){
        alert(response);
    }
})

вместо $ .toJSON из плагина JSON вы можете использовать другую версию (JSON.stringify) из http://www.json.org/

Если ваш WebMethod имел такие параметры, как

public Response ValidateAddress(Request request1, Request myRequest2)

значение параметра data вызова ajax должно быть равно

data: {request1:$.toJSON(myData1), myRequest2:$.toJSON(myData2)}

или

data: {request1:JSON.stringify(myData1), myRequest2:JSON.stringify(myData2)}

если вы предпочитаете другую версию кодера JSON.

5 голосов
/ 29 апреля 2010

Ваша проблема разбита на две части:

Создание строки JSON

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

var data = {
    "Address": {
        "Address1": "123 Main Street",
        "Address2": null,
        "City": "New York",
        "State": "NY",
        "Zip": "10000",
        "AddressClassification": null
    }
};
data = JSON.stringify(data);

Первый шаг, описанный выше, создает объект с использованием буквенной нотации объекта Javascript, которая является надмножеством JSON (как использовано выше, на самом деле это то же самое, что и JSON, но игнорируйте это). Второй бит берет этот объект и преобразует его в строку.

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

var data = {
    "Address": {
        "Address1": address1,
        "Address2": address2,
        "City": city,
        "State": state,
        "Zip": zip,
        "AddressClassification": null
    }
};
data = JSON.stringify(data);

В любом случае, теперь у вас есть строка.

Отправка строки JSON в веб-службу

Необходимо выяснить, ожидает ли веб-служба данных в формате JSON , равных телу POST, или ожидает, что данные JSON будут значением параметра в более общем name = значение POST-данных в кодировке URL. Я бы предпочел ожидать первого, поскольку веб-сервис, кажется, специально предназначен для работы с данными в формате JSON.

Если предполагается, что будет телом POST, ну, я никогда не делал этого с jQuery, и то, что вы цитировали, выглядит правильным для меня, читающего документы. Если это не сработает, я бы дважды проверил, что ваша структура объекта действительно то, что они ожидают увидеть. Например, если он просто проверяет один адрес, мне интересно, ожидает ли он получения просто объекта Address, а не объекта, содержащего объект Address, например ::

{
    "Address1": "123 Main Street",
    "Address2": null,
    "City": "New York",
    "State": "NY",
    "Zip": "10000",
    "AddressClassification": null
}

Если предполагается, что это значение параметра в старых скучных данных в многочастной форме в кодировке URL, то:

$.ajax({
    type: "POST",
    url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
    data: "paramname=" + encodeURIComponent(data),
    dataType: "json",
    success: function(response){
        alert(response);
    }
})

Я удалил contentType, поэтому jQuery вернется к своему значению по умолчанию («application / x-www-form-urlencoded») и обеспечит правильное кодирование строки, созданной выше, в этот тип содержимого. Вам нужно найти paramname для использования (возможно, «Адрес» и увидеть мой предыдущий комментарий об отправке только адреса, а не объекта, содержащего дочерний объект адреса?).

1 голос
/ 29 апреля 2010

Все извинения, если этот ответ приходит слишком поздно или является дублированием.

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

Пример:

address = new Object();
address.Address = new Object();
address.Address.Address1 = "123 Main Street";
address.Address.Address2 = "";
address.Address.City = "New York";
address.Address.State = "NY";
address.Address.Zip = "10000";
address.Address.AddressClassification = null;
$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
    data: address,
    dataType: "json",
    success: function(response){
        alert(response);
    }
});
1 голос
/ 29 апреля 2010

Вы должны передать это так:

$.ajax({
  type: "POST",
  url: "WebService.asmx/WebMethodName",
  data: "{'fname':'dave', 'lname':'ward'}",
  contentType: "application/json; charset=utf-8",
  dataType: "json"
});

Посмотрите эту статью для получения более подробной информации: 3 ошибки, которых следует избегать при использовании jQuery с ASP.NET AJAX

1 голос
/ 29 апреля 2010

Я бы создал объект javascript и затем вызвал JSON.stringify, чтобы превратить его в действительный JSON. Вы можете скачать его с здесь .

Вы можете сделать что-то вроде этого:

var address= {};

address["Address1"] = "your val";
address["Address2"] = "your val";
address["City"] = "your val";
address["State"] = "your val";
address["Zip"] = "your val";

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://bmccorm-xp/HBUpsAddressValidation/AddressValidation.asmx/ValidateAddress",
    data: JSON.stringify(address),
    dataType: "json",
    success: function(response){
        alert(response);
    }
});
1 голос
/ 29 апреля 2010

JSON.stringify возьмет объект javascript и превратит его в строку. Бьюсь об заклад, что если вы создаете объект Javascript, как

var jsonData = {
    address: 'address',
    address1: 'address1',
    address2: 'address2'
};

, а затем передайте jsonData как «данные» в вызове ajax, после чего он преобразует объект в текст json для вас.

0 голосов
/ 29 апреля 2010

Получите плагин jquery, который может конвертировать любой объект javascript в json. Например:

http://plugins.jquery.com/project/json

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