我有点困惑于何时必须使用JSON序列化序列化对象以及何时不需要(甚至不必要)。
我花了几天时间尝试使用jQuery.ajax和JSON发送简单对象列表。 我有一个名为Product的课程:
public class Product
{
public string Name;
public string Qnt;
public string Price;
}
以及返回填充了Products
的列表的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>');
});
...它不会起作用...因为在客户端,我只是得到一个长字符串(当我使用$ .each时,它会被逐字符解析) - 我学到了它应该首先解析
我花了很长时间才意识到我必须将其作为产品对象列表返回,没有序列化,和客户端获得完美JSON格式的产品列表!
修改: 我实际上不明白的是:如果我序列化我的列表,它会返回JSON格式化的字符串,在我可以使用之前必须对其进行解析。如果我没有序列化我的列表,它返回相同的数据,但作为一个对象,而不是一个字符串,所以我可以立即使用它。 我怎么知道我是否必须对我的数据使用JSON序列化,或者它总是由框架完成?
答案 0 :(得分:3)
您没有直接将List<Product>
退回给客户。它不会像List<Product>
一样通过网络 - 在HTTP级别没有这样的概念。但是,您正在使用的服务器端框架正在为您执行JSON序列化。如果先执行序列化,那么序列化的字符串将被JSON序列化,包括另一级别的转义等。
答案 1 :(得分:1)
我认为您需要首先调用$ .parseJSON(msg.d)将JSON字符串转换为JS对象,jQuery将不会出现任何问题。您最终可能会得到一个像“yourServiceMethodCallNameResult”这样的对象,该对象将包含一系列对象(您的产品)。
答案 2 :(得分: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];
});
答案 3 :(得分:0)
您使用JSON通过网络发送信息。 JSON是一种比XML更有效的数据表示,因为它不那么冗长。通常,您会在服务器上将类或其他内容序列化为JSON,将其发送到客户端,然后客户端将其反序列化为JavaScript。或者从JavaScript中将它从对象或数组序列化为JSON,将其发送到服务器,然后服务器将其反序列化