NewTonSoft.Json进行序列化和反序列化-演习

JSON已经流行很久了,对于它的了解不是很深,最近公司做项目需要尽可能少的和服务器进行通讯!

心可能少的和服务器通讯,那意思是说,只要获取数据,不要任何其它“杂七杂八”的HTML代码,想想,只要ajax就可以了嘛,但又想ajax只是做到了局部刷新,没有做到去除“杂七杂八”的HTML代码,获取回来还是有DIV,SPAN,A,等等……

查了一下资料,发现JSON可以尽可能的满足这个需求!

一个新事物的诞生,不是偶然的横空出世,而是应运而生的。有需求,就有市场!

对于JSON的初步了解就不介绍啦,自己GOOGLE BAIDU一下。有关 JSON 的更多介绍,访问它的官方网站:http://www.json.org

本人使用C#吃饭,首先下载最新版的 JSON.NET 源码 (http://json.codeplex.com/),然后解压,SRC 目录是其源码,我们打开 Newtonsoft.Json.Net20.sln,这个是.NET 2.0 的解决方案,然后编译,很顺利的就通过了,反正我是没遇啥特殊情况。编译完成后在 bin\Release 目录中你会看到一个名为 DotNet20 的目录,很显然这个 JSON.net 的源码做的相当不错,已经为我们写好了在.NET2.0 下运行的方法。引用到项目当中。

添加下面两句:


using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

代码:

==================================================

DataTable dt= new DataTable();
            dt.Columns.Add("a",Type.GetType("System.String"));
            dt.Columns.Add("b", Type.GetType("System.String"));
            dt.Columns.Add("c", Type.GetType("System.String"));

            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["a"] = "1" + i.ToString();
                dr["b"] = "2" + i.ToString();
                dr["c"] = "3" + i.ToString();
                dt.Rows.Add(dr);
            }

            string sj = JsonConvert.SerializeObject(dt,new DataTableConverter());

            //string dt1 = (string)JsonConvert.DeserializeObject(strJson);


           Response.Write(sj);

输出结果:

[{“a”:”10″,”b”:”20″,”c”:”30″},{“a”:”11″,”b”:”21″,”c”:”31″},{“a”:”12″,”b”:”22″,”c”:”32″},{“a”:”13″,”b”:”23″,”c”:”33″},{“a”:”14″,”b”:”24″,”c”:”34″},{“a”:”15″,”b”:”25″,”c”:”35″},{“a”:”16″,”b”:”26″,”c”:”36″},{“a”:”17″,”b”:”27″,”c”:”37″},{“a”:”18″,”b”:”28″,”c”:”38″},{“a”:”19″,”b”:”29″,”c”:”39″}]

以上实现了datatable序列化!!

再通过下面这三名,可以把Dataset传给Datatabel,就可以实现数据库到json的序列化

DataSet ds = 得到数据集;
if (ds.Tables.Count > 0)
DataTable dt = ds.Tables[0];

其实很简单吧!!

下面介绍List和 Dectionary集合的序列化和反序列化:

List序列化:

List<Customer> _list = new List<Customer>();
 
_list.Add(new Customer {  Unid=1, CustomerName="宋江",Memo="天魁星"});
_list.Add(new Customer { Unid = 1, CustomerName = "吴用", Memo = "天机星" });
_list.Add(new Customer { Unid = 1, CustomerName = "石秀", Memo = "天慧星" });
 
string strJson = JsonConvert.SerializeObject(_list, Formatting.Indented);
 
/*
[{"ID": 1,"CustomerName": "宋江","Memo": "天魁星"},
  {"ID": 1,"CustomerName": "吴用","Memo": "天机星"},
  {"ID": 1,"CustomerName": "石秀","Memo": "天慧星"}]
*/

2)List反序列化
反序列化一个 json 对象到一个.net 集合,只需指定要反序列化的集合类型即可。
json.net 支持大量的集合类型。

string strJson = @”[{“”ID””: 1,””CustomerName””: “”宋江””,””Memo””: “”天魁星
“”},{“”ID””: 1,””CustomerName””: “” 吴用 “”,””Memo””: “” 天机星 “”},{“”ID””:
1,””CustomerName””: “”石秀””,””Memo””: “”天慧星””}]”;

List<Customer> _list = JsonConvert.DeserializeObject<List<Customer>>(strJson);
foreach (Customer c in _list)
{
    Console.WriteLine(c.CustomerName);
}
 
/*
宋江
吴用
石秀
*/
 

3)Dictionary反序列化
json.net 也能把 json 对象反序列化为一个泛型字典。json 对象的属性名和值会被添加到一个字典中。

string strJson = @"{""ID"": 1,""CustomerName"": ""宋江"",""Memo"": ""天魁星""}";
 
Dictionary<string, string> _dictionary = JsonConvert.DeserializeObject<Dictionary<string,
string>>(strJson); 
 
foreach (KeyValuePair<string, string> kp in _dictionary)
{
    Console.WriteLine(kp.Key + ":" + kp.Value);
}

看到这里是不是有些“懵”,这不就是集合的“字符串”化吗?没什么大不了的。非也,这只是服务器端的响应,要结合起客户端的json2.js+jqery执行起来,效果,一般人我不告诉他!

=========================================================

CS代码:

   DataTable dt= new DataTable();
            dt.Columns.Add("a",Type.GetType("System.String"));
            dt.Columns.Add("b", Type.GetType("System.String"));
            dt.Columns.Add("c", Type.GetType("System.String"));
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["a"] = "1" + i.ToString();
                dr["b"] = "2" + i.ToString();
                dr["c"] = "3" + i.ToString();
                dt.Rows.Add(dr);
            }
            string sj = JsonConvert.SerializeObject(dt,new DataTableConverter());
           Response.Write(sj);
           Response.End();

======================================================

看下面客户端的调用代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" src="Scripts/jquery-1.4.1.min.js"></script>
</head>
<body>
    <form id="form1" runat="server">
    <div style=" margin:50px;" id="f">
    </div>
    </form>
    <script type="text/javascript">
        $.getJSON("default.aspx", function (data) {
            var ss = "";
            for (var i = 0; i < getJsonLength(data); i++) {
                ss += data[i].a + data[i].b + data[i].c + "<br>";
            }
            $("#f").html(ss);
        });
        function getJsonLength(json) {
            var len = 0;
            if (Boolean(json)) {
                for (i in json) len++;
            }
            return len;
        }
    </script>
</body>
</html>

简单的说明了一下整个json序列化和反序列化,客户端的使用,有什么不明白的就百度+谷歌!
====================================

补充说明一下,在序列化日期型的数据时,需要加上一个

JavaScriptDateTimeConverter mTimeConverter = new JavaScriptDateTimeConverter();
或者
IsoDateTimeConverter mTimeConverter = new IsoDateTimeConverter();

的格式说明!IsoDateTimeConverter和JavaScriptDateTimeConverter类都是来至Newtonsoft.Json,所以在使用时,记得引用该插件(using Newtonsoft.Json、using Newtonsoft.Json.Converters)

比如:

上面的dr[“c”] = “3” + i.ToString();改成dr[“c”] = DateTime.Now;

那么序列化的时候就要改成
string sj = JsonConvert.SerializeObject(dt,new DataTableConverter(),new IsoDateTimeConverter());

或者
string sj = JsonConvert.SerializeObject(dt,new DataTableConverter(),JavaScriptDateTimeConverter());

返回的值格式是不一样的,一个是时间戳,一个是具体的时候字符串。

结了,写得有点乱,后期有时间就整理!



本文固定链接: http://www.ntxz.net/?p=2108 | 周忞 | 吉心的记事本



该日志由 吉心 于2013年10月09日发表在 网络摘编 分类下, 你可以发表评论
在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: NewTonSoft.Json进行序列化和反序列化-演习 | 周忞 | 吉心的记事本
关键字: , ,

NewTonSoft.Json进行序列化和反序列化-演习:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!