Как создать объект JSON для отправки в AJAX WebService?

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

[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 для отправки в веб-службу?


UPDATE: Оказывается, проблема с моим запросом не была форматированием 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)?

Ответ 1

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

Данные должны быть закодированы в 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.

Ответ 2

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

Создание строки 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 будут значением параметра в более общем имени = значение, закодированное в URL-адресе Данные POST. Я хотел бы ожидать первого, потому что веб-служба, похоже, специально разработана для работы с данными в формате 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 для использования (возможно, "Адрес" и увидеть мой предыдущий комментарий о отправке только адреса, а не объекта, содержащего дочерний объект адреса?).

Ответ 3

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

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

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

Ответ 4

Я бы создал объект 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);
    }
});

Ответ 6

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

Из того, что я понимаю, кажется, что вы пытаетесь отправить только строку объекта 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);
    }
});

Ответ 7

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

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