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

После попытки отформатировать мои данные 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)?

15
задан Community 23 May 2017 в 12:08
поделиться

7 ответов

Ответ очень прост и основан на моих предыдущих сообщениях Могу ли я вернуть 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.

12
ответ дан 1 December 2019 в 03:34
поделиться

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

Насколько я понимаю, похоже, что вы пытаетесь отправить только строку объекта 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
ответ дан 1 December 2019 в 03:34
поделиться

Я бы создал объект 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
ответ дан 1 December 2019 в 03:34
поделиться

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

$.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
ответ дан 1 December 2019 в 03:34
поделиться

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

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

5
ответ дан 1 December 2019 в 03:34
поделиться

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

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

и затем передадите jsonData как 'data' в вызове ajax, то он преобразует объект в текст json.

1
ответ дан 1 December 2019 в 03:34
поделиться

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

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

0
ответ дан 1 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: