После попытки отформатировать мои данные 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)?
Ответ очень прост и основан на моих предыдущих сообщениях Могу ли я вернуть 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.
Приношу извинения, если этот ответ приходит слишком поздно или является дублированием.
Насколько я понимаю, похоже, что вы пытаетесь отправить только строку объекта 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);
}
});
Я бы создал объект 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);
}
});
Вы должны передать это так:
$.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
Ваша проблема разбивается на две части:
Ваш 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 будут являться телом 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" и см. мой предыдущий комментарий об отправке только адреса, а не объекта, содержащего дочерний объект адреса?).
JSON.stringify возьмет объект javascript и превратит его в строку. Однако я готов поспорить, что если вы создадите объект Javascript типа
var jsonData = {
address: 'address',
address1: 'address1',
address2: 'address2'
};
и затем передадите jsonData как 'data' в вызове ajax, то он преобразует объект в текст json.
Получите плагин jquery, который может конвертировать любой объект javascript в json. Например: