【问题标题】:When should I use JSON serialization and why?我什么时候应该使用 JSON 序列化,为什么?
【发布时间】:2011-11-24 07:07:25
【问题描述】:

对于何时必须使用 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 序列化,否则它总是由框架完成

【问题讨论】:

  • 不要自己格式化 HTML。使用 jquery.tmpl。 Javascript(您编写的代码)应该用于逻辑,而不是用于渲染。

标签: c# asp.net json jquery


【解决方案1】:

您不会将List&lt;Product&gt; 直接返回给客户。它不会像List&lt;Product&gt; 那样通过网络——在 HTTP 级别没有这样的概念。但是,您使用的服务器端框架正在为您执行 JSON 序列化。如果先进行序列化,那么序列化后的字符串会被 JSON 序列化,包括另一层转义等。

【讨论】:

  • 这是否意味着当我将数据发送回客户端时,我永远不必进行 JSON 序列化?那么 JavaScriptSerializer 是干什么用的呢?另外,我发现很多关于在发送数据之前序列化数据的文本......
  • @Goran: JavaScriptSerializer 可能框架使用来为您序列化您的数据 - 以及您希望成为的其他场景能够创建 JSON 这将是有意义的。只是在这种情况下,它是为您隐式完成的。这就像 SOAP 调用 - 您通常不会自己调用 SoapFormatter...
【解决方案2】:

我认为您需要先调用 $.parseJSON(msg.d) 将 JSON 字符串转换为 JS 对象,这样 jQuery 就不会出现迭代问题。您可能最终会得到一个像“yourServiceMethodCallNameResult”这样的对象,并且该对象将包含一个对象数组(您的产品)。

【讨论】:

    【解决方案3】:

    您尚未提及如何查询产品列表。 JavaScriptSerializer 的问题在于它返回一个包装在 XML 标记中的 JSON 输出,这使它成为客户端上的 XMLObject。您可以简单地获取内部文本内容并使用 $.parseJSON() 方法将其转换为客户端上的 JSON 对象。

    查询 WCF 服务的示例,该服务使用 JavaScriptSerializer 将产品列表序列化为 JSON。

    服务器端:

    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];
    });
    

    【讨论】:

    • 好的,我意识到$.parseJSON 将使用字符串创建对象,但仍然存在问题:为什么/何时我使用序列化/解析,何时我可以发送对象列表和 asp。 net 为我做 JSON 序列化?谢谢!
    • 阅读本文以了解为何使用 JSON? robtiffany.com/windows-phone-7/…
    • 为了简单。 1)它是通用的,可以用于任何平台/语言,就像 XML 2)关于 XML,它摆脱了标签,使其非常小巧紧凑。
    • 这是有趣的文字,但我想我不够清楚:好的,我想使用 JSON 从 asp.net 传输数据。但是我怎么知道它会自动序列化,还是我必须序列化它?我已经用这个更新了我的问题。
    • @MohibSheth,感谢您解析示例,但我只能选择一个答案。
    【解决方案4】:

    您使用 JSON 通过网络发送信息。 JSON 比 XML 更有效地表示数据,因为它不那么冗长。通常,您会在服务器上将一个类或其他任何内容序列化为 JSON,将其发送到客户端,然后客户端将其反序列化为 JavaScript。或者从 JavaScript 中将它从一个对象或数组序列化为 JSON,发送到服务器,然后服务器在那里反序列化它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 2021-07-13
      • 1970-01-01
      相关资源
      最近更新 更多