簡體   English   中英

如何構建要發送到AJAX WebService的JSON對象?

[英]How do I build a JSON object to send to an AJAX WebService?

在嘗試使用javascript手動格式化我的JSON數據並且悲慘地失敗之后,我意識到可能有更好的方法。 以下是C#中Web服務方法和相關類的代碼:

[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;
}

Web服務使用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:指定的所有內容,這就是我的問題所在。 如何在javascript中構建格式正確的JSON對象,以便我可以將其插入到我的ajax調用中,如下所示:

data: theRequest

我最終會從表單中的文本輸入中提取數據,但是現在硬編碼的測試數據很好。

如何構建格式正確的JSON對象以發送到Web服務?


更新:事實證明,我的請求的問題不是JSON的格式化,正如TJ指出的那樣,而是我的JSON文本不符合Web服務的要求。 這是基於WebMethod中的代碼的有效JSON請求:

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

這提出了另一個問題: 在對ASP.NET Web服務(ASMX)的JSON請求中,何時區分大小寫很重要?

答案很簡單,基於我以前的帖子如果ContentType不是JSON ,我可以從.asmx Web服務返回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);
    }
})

而不是來自JSON插件的$ .toJSON,你可以使用來自http://www.json.org/的另一個版本(JSON.stringify)

如果你的WebMethod有像這樣的參數

public Response ValidateAddress(Request request1, Request myRequest2)

ajax調用的data參數值應該是這樣的

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

要么

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

如果您更喜歡其他版本的JSON編碼器。

您的問題分為兩部分:

創建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字符串發送到Web服務

您需要了解Web服務是否期望JSON格式的數據 POST主體,或者是否期望JSON數據是更常見的name = value URL編碼的POST數據中的參數值。 我傾向於期望前者,因為Web服務似乎專門設計用於處理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使用(也許是“地址”,看看我以前的約僅發送地址,而不是包含地址子對象的對象有何評論?)。

JSON.stringify將獲取一個javascript對象並將其轉換為字符串。 我敢打賭,如果你創建一個像Javascript的對象

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

然后將jsonData作為'data'傳遞給ajax調用,然后它會將對象轉換為json文本。

我將創建一個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"
});

有關更多詳細信息,請查看本文: 使用帶有ASP.NET AJAX的jQuery時要避免的3個錯誤

所有道歉,如果這個答案來得太晚,或者是重復。

根據我的理解,似乎你試圖只發送一個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);
    }
});

給自己一個jquery插件,可以將任何javascript對象轉換為json。 例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM