Как создать объект 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);
}
});
Ответ 5
Вам нужно передать его следующим образом:
$.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
Ответ 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