2011-11-24 270 views
2

我對於何時必須使用JSON序列化序列化對象以及什麼時候不需要(甚至是不必要的)有點困惑。什麼時候應該使用JSON序列化,爲什麼?

我花了好幾天試圖發送一個使用jQuery.ajax和JSON的簡單對象列表。 我有一個類命名的產品:

public class Product 
{ 
    public string Name; 
    public string Qnt; 
    public string Price; 
} 

和Web方法返回填充產品列表

List<Product> p = new List<Product>(); 

我以前System.Web.Script.Serialization.JavaScriptSerializer序列化的JSON這個列表,並將其發送到客戶端作爲串,在那裏我使用jQuery

$.each(msg.d, function (index, Product) { 
    $('#details').append('<p>Name: ' + Product.Name 
          + '<br />Quantity: ' + Product.Qnt 
          + '<br />Price: ' + Product.Price + '</p>'); 
}); 

格式化它,而且它是行不通的......因爲在客戶端,我只是得到一個長字符串(它會被解析ç按字符haracter,當我使用$。每個)- 我才知道這應該解析後的第一

,經過一段時間,直到我意識到,我只是把它作爲返回Product對象列表,沒有系列化,客戶可以獲得完美的JSON格式的產品列表!

編輯: 我其實不明白:如果我連載我的名單,它返回JSON字符串格式化必須被解析之前,我可以使用它。如果我不序列化我的列表,它將返回相同的數據,但作爲對象,不是字符串,因此我可以立即使用它。 我怎麼知道我必須在我的數據上使用JSON序列化,還是始終要通過框架完成?

+0

不要自己格式化HTML。使用jquery.tmpl。 Javascript(你寫的代碼)應該用於邏輯,而不是渲染。 – jgauffin

回答

3

您沒有將您的List<Product>直接返回給客戶端。它不會像List<Product>那樣通過網絡 - 在HTTP層面上沒有這樣的概念。但是,您正在使用的服務器端框架正在爲您執行JSON序列化。如果您先執行序列化,那麼序列化的字符串將被JSON序列化,包括另一個級別的轉義等。

+0

這是否意味着當我將數據發送回客戶端時,我從不必做JSON序列化?那麼JavaScriptSerializer用於什麼?另外,我發現大量的文章在發送數據之前討論序列化數據... – Goran

+0

@Goran:'JavaScriptSerializer'可能被*框架用於序列化您的數據 - 在其他*您想要的場景中能夠創建JSON,這是有道理的。只是在這種情況下,它是爲你隱式完成的。這就像SOAP調用 - 你通常不會自己調用'SoapFormatter' ... –

1

我認爲您需要先調用$ .parseJSON(msg.d)將JSON字符串轉換爲JS對象,jQuery將沒有任何問題迭代。你可能最終會得到一個像「yourServiceMethodCallNameResult」這樣的對象,並且該對象將有一個對象(您的產品)的數組。

1

你還沒有提到你如何查詢產品列表。 JavaScriptSerializer的問題在於它返回一個包裹在XML標籤中的JSON輸出,這使得它成爲客戶端上的XMLObject。您可以簡單地獲取內部文本內容並使用$ .parseJSON()方法將其轉換爲客戶端上的JSON對象。

查詢使用JavaScriptSerializer將產品列表序列化爲JSON的WCF服務的示例。

服務器端:

JavaScriptSerializer js = new JavaScriptSerializer(); 
List<Product> p = new List<Product>() 
{ 
new Product() { Name = "one", Price = "1", Qnt = "1" }, 
new Product() { Name = "two", Price = "1", Qnt = "1" }, 
new Product() { Name = "three", Price = "1", Qnt = "1" }, 
new Product() { Name = "four", Price = "1", Qnt = "1" }, 
new Product() { Name = "five", Price = "1", Qnt = "1" }, 
new Product() { Name = "six", Price = "1", Qnt = "1" } 
}; 
return js.Serialize(p); 

客戶端:

$.get("http://server/service/GetProducts", function (data) { 
    var jsonObj = $.parseJSON(data.firstChild.textContent); 
    var obj1 = jsonObj[0]; 
}); 
+0

好吧,我確定'$ .parseJSON'會創建對象字符串,但stil仍然是一個問題:爲什麼/何時使用序列化/解析,當我可以發送對象列表和asp.net爲我做JSON序列化?謝謝! – Goran

+0

閱讀此處瞭解JSON的原因? http://robtiffany.com/windows-phone-7/windows-phone-7-line-of-business-app-dev-building-a-wcf-rest-json-service –

+0

爲了簡單起見。 1)它的通用性,可用於任何平臺/語言,就像XML一樣2)在XML方面,它擺脫了使標籤變得非常小巧和緊湊的標籤。 –

0

您使用JSON通過網絡發送的信息。 JSON比XML更高效地表示數據,因爲它不那麼冗長。通常情況下,您需要將一個類或其他類串行化爲服務器上的JSON,將其發送給客戶端,然後客戶端將其反序列化爲JavaScript。或者從JavaScript中將它從一個對象或數組序列化爲JSON,然後將其發送到服務器,然後服務器將其反序列化到那裏

相關問題