2011-11-24 269 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,然后将其发送到服务器,然后服务器将其反序列化到那里

相关问题