欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在.NET使用JSON作为数据交换格式实例演示

程序员文章站 2024-03-04 11:26:23
我们知道在net中我们有多种对象序列化的方式,如xml方式序列化、binary序列化,其中xml序列化是一种比较通用的在各语言之间传递数据的方式。除了这两种序列化方式之外,...
我们知道在net中我们有多种对象序列化的方式,如xml方式序列化、binary序列化,其中xml序列化是一种比较通用的在各语言之间传递数据的方式。除了这两种序列化方式之外,在net中还可以使用json序列化。

json(javascript object notation)是一种轻量级轻量级的数据交换格式,并且它独立于编程语言,与xml序列化相比,json序列化后产生的数据一般要比xml序列化后数据体积小,所以在facebook等知名网站中都采用了json作为数据交换方式。在net中有三种常用的json序列化的类,分别是  systemwebscriptserializationjavascriptserializer类、systemruntimeserializationjsondatacontractjsonserializer类和newtonsoftjsonjsonconvert类。

为了便于下面的演示,下面提供一个类的代码

复制代码 代码如下:

[datacontract]
publicclass user
{
///<summary>
/// 编号
///</summary>
[datamember]
publicint userid { get; set; }
///<summary>
/// 用户名
///</summary>
[datamember]
publicstring username { get; set; }
///<summary>
/// 创建时间
///</summary>
[datamember]
[jsonconverter(typeof(isodatetimeconverter))]
public datetime createdate { get; set; }
///<summary>
/// 生日
///</summary>
[datamember]
[jsonconverter(typeof(javascriptdatetimeconverter))]
public datetime birthday { get; set; }
///<summary>
/// 相关url
///</summary>
[datamember]
public list<string> urls { get; set; }
///<summary>
/// 薪水
///</summary>
//[scriptignore]//使用javascriptserializer序列化时不序列化此字段
//[ignoredatamember]//使用datacontractjsonserializer序列化时不序列化此字段
//[jsonignore]//使用jsonconvert序列化时不序列化此字段
publicint salary { get; set; }
///<summary>
/// 权利级别
///</summary>
[datamember]
public priority priority { get; set; }
public user()
{
urls =new list<string>();
}
}
///<summary>
/// 权利级别
///</summary>
publicenum priority:byte
{
lowest=0x1,
belownormal=0x2,
normal=0x4,
abovenormal=0x8,
highest=0x16
}

使用systemwebscriptserializationjavascriptserializer类
  systemwebscriptserializationjavascriptserializer类是net类库中自带的一种json序列化实现,在net framework5及以后版本中可以使用这个类,这个类位于systemwebextensionsdll中,使用这个类是必须添加对这个dll的引用。
  下面的代码是使用javascriptserializer进行序列化和反序列化的例子:
复制代码 代码如下:

publicstaticvoid javascriptserializerdemo()
{
user user =new user { userid =1, username ="李刚", createdate = datetimenowaddyears(-30),birthday=datetimenowaddyears(-50), priority = priorityhighest, salary =500000 };
//javascriptserializer类在systemwebextensionsdll中,注意添加这个引用
javascriptserializer serializer =new javascriptserializer();
//json序列化
string result=serializerserialize(user);
consolewriteline("使用javascriptserializer序列化后的结果:{0},长度:{1}", result, resultlength);
//json反序列化
user = serializerdeserialize<user>(result);
consolewriteline("使用javascriptserializer反序列化后的结果:userid:{0},username: {1},createdate:{2},priority:{3}", useruserid, userusername, usercreatedate, userpriority);
}

说明:如果不想序列化某个字段,可以在字段前面加[jsonignore]标记。
  使用systemruntimeserializationjsondatacontractjsonserializer类
  systemruntimeserializationjsondatacontractjsonserializer类位于systemservicemodelwebdll中,使用这个类时除了需要添加对systemservicemodelwebdll的引用之外,还需要添加systemruntimeserializationdll的引用,注意这个类也是在net framework5及以后版本中可以使用。
  下面是使用datacontractjsonserializer类的例子:
复制代码 代码如下:

publicstaticvoid datacontractjsonserializerdemo()
{
user user =new user { userid =1, username ="李刚", createdate = datetimenowaddyears(-30), birthday = datetimenowaddyears(-50), priority = priorityabovenormal, salary =50000 };
string result =stringempty;
//datacontractjsonserializer类在systemservicemodelwebdll中,注意添加这个引用
datacontractjsonserializer serializer =new datacontractjsonserializer(typeof(user));
using (memorystream stream =new memorystream())
{
//json序列化
serializerwriteobject(stream, user);
result = encodingutfgetstring(streamtoarray());
consolewriteline("使用datacontractjsonserializer序列化后的结果:{0},长度:{1}", result, resultlength);
}
//json反序列化
byte[] buffer = encodingutfgetbytes(result);
using (memorystream stream =new memorystream(buffer))
{
user = serializerreadobject(stream) as user;
consolewriteline("使用datacontractjsonserializer反序列化后的结果:userid: {0},username:{1},createdate:{2},priority:{3}", useruserid, userusername, usercreatedate, userpriority);
}
}

注意:要使用datacontractjsonserializer类进行序列化和反序列化,必须给类加上[datacontract]属性,对要序列化的字段加上[datamember]属性,如果不想序列化某个字段或者属性,可以加上[ignoredatamember]属性。
  使用newtonsoftjsonjsonconvert类
  newtonsoftjsonjsonconvert类是非微软提供的一个json序列化和反序列的开源免费的类库(下载网址是:http://wwwcodeplexcom/json/),它提供了更灵活的序列化和反序列化控制,并且如果你的开发环境使用的是net framework5及以后版本的话,你就可以使用linq to json,这样一来面对一大段的数据不必一一解析,你可以使用linq to json解析出你关心的那部分即可,非常方便。
  下面是使用newtonsoftjsonjsonconvert类的例子:
复制代码 代码如下:

publicstaticvoid jsonconvertdemo()
{
user user =new user { userid =1, username ="李刚", createdate = datetimenowaddyears(-30), birthday = datetimenowaddyears(-50), priority = prioritybelownormal, salary =5000 };
//jsonconvert类在newtonsoftjsonnetdll中,注意到http://wwwcodeplexcom/json/下载这个dll并添加这个引用
//json序列化
string result = jsonconvertserializeobject(user);
consolewriteline("使用jsonconvert序列化后的结果:{0},长度:{1}", result, resultlength);
//json反序列化
user = jsonconvertdeserializeobject<user>(result);
consolewriteline("使用jsonconvert反序列化后的结果:userid:{0},username: {1},createdate:{2},priority:{3}", useruserid, userusername, usercreatedate, userpriority);
}
publicstaticvoid jsonconvertlinqdemo()
{
user user =new user { userid =1, username ="周公", createdate = datetimenowaddyears(-8), birthday = datetimenowaddyears(-32), priority = prioritylowest, salary =500, urls =new list<string> { "http://zhoufoxcnblog51ctocom", "//www.jb51.net" } };
//jsonconvert类在newtonsoftjsonnetdll中,注意到http://wwwcodeplexcom/json/下载这个dll并添加这个引用
//json序列化
string result = jsonconvertserializeobject(user);
consolewriteline("使用jsonconvert序列化后的结果:{0},长度:{1}", result, resultlength);
//使用linq to json
jobject jobject = jobjectparse(result);
jtoken token = jobject["urls"];
list<string> urllist =new list<string>();
foreach (jtoken t in token)
{
urllistadd(ttostring());
}
consolewrite("使用linq to json反序列化后的结果:[");
for (int i =0; i < urllistcount -1;i++ )
{
consolewrite(urllist[i] +",");
}
consolewriteline(urllist[urllistcount -1] +"]");
}

注意:如果有不需要序列化的字段,可以给该字段添加[jsonignore]标记。在newtonsoft这个类库中对于日期的序列化有多种方式,可以类的datatime成员添加上对应的标记,这样在进行序列化和反序列化时就会按照指定的方式进行,在本例中user类的createdate属性添加的属性是[jsonconverter(typeof(isodatetimeconverter))],而birthday属性添加的属性是[jsonconverter(typeof(javascriptdatetimeconverter))],从序列化的结果可以看出来它们最终的表现形式并不一样。
  本文中所有的示例代码如下:
复制代码 代码如下:

using system;
using systemcollectionsgeneric;
using systemlinq;
using systemtext;
using systemwebscriptserialization;
using systemruntimeserializationjson;
using systemio;
using systemruntimeserialization;
using newtonsoftjson;
using newtonsoftjsonlinq;
using newtonsoftjsonconverters;
namespace jsondemo
{
class program
{
staticvoid main(string[] args)
{
javascriptserializerdemo();
datacontractjsonserializerdemo();
jsonconvertdemo();
jsonconvertlinqdemo();
consolereadline();
}
publicstaticvoid javascriptserializerdemo()
{
user user =new user { userid =1, username ="李刚", createdate = datetimenowaddyears(-30),birthday=datetimenowaddyears(-50), priority = priorityhighest, salary =500000 };
//javascriptserializer类在systemwebextensionsdll中,注意添加这个引用
javascriptserializer serializer =new javascriptserializer();
//json序列化
string result=serializerserialize(user);
consolewriteline("使用javascriptserializer序列化后的结果:{0},长度:{1}", result, resultlength);
//json反序列化
user = serializerdeserialize<user>(result);
consolewriteline("使用javascriptserializer反序列化后的结果:userid:{0},username:{1},createdate:{2},priority:{3}", useruserid, userusername, usercreatedate, userpriority);
}
publicstaticvoid datacontractjsonserializerdemo()
{
user user =new user { userid =1, username ="李刚", createdate = datetimenowaddyears(-30), birthday = datetimenowaddyears(-50), priority = priorityabovenormal, salary =50000 };
string result =stringempty;
//datacontractjsonserializer类在systemservicemodelwebdll中,注意添加这个引用
datacontractjsonserializer serializer =new datacontractjsonserializer(typeof(user));
using (memorystream stream =new memorystream())
{
//json序列化
serializerwriteobject(stream, user);
result = encodingutfgetstring(streamtoarray());
consolewriteline("使用datacontractjsonserializer序列化后的结果:{0},长度:{1}", result, resultlength);
}
//json反序列化
byte[] buffer = encodingutfgetbytes(result);
using (memorystream stream =new memorystream(buffer))
{
user = serializerreadobject(stream) as user;
consolewriteline("使用datacontractjsonserializer反序列化后的结果:userid:{0},username:{1},createdate:{2},priority:{3}", useruserid, userusername, usercreatedate, userpriority);
}
}
publicstaticvoid jsonconvertdemo()
{
user user =new user { userid =1, username ="李刚", createdate = datetimenowaddyears(-30), birthday = datetimenowaddyears(-50), priority = prioritybelownormal, salary =5000 };
//jsonconvert类在newtonsoftjsonnetdll中,注意到http://wwwcodeplexcom/json/下载这个dll并添加这个引用
//json序列化
string result = jsonconvertserializeobject(user);
consolewriteline("使用jsonconvert序列化后的结果:{0},长度:{1}", result, resultlength);
//json反序列化
user = jsonconvertdeserializeobject<user>(result);
consolewriteline("使用jsonconvert反序列化后的结果:userid:{0},username:{1},createdate:{2},priority:{3}", useruserid, userusername, usercreatedate, userpriority);
}
publicstaticvoid jsonconvertlinqdemo()
{
user user =new user { userid =1, username ="周公", createdate = datetimenowaddyears(-8), birthday = datetimenowaddyears(-32), priority = prioritylowest, salary =500, urls =new list<string> { "http://zhoufoxcnblog51ctocom", "//www.jb51.net" } };
//jsonconvert类在newtonsoftjsonnetdll中,注意到http://wwwcodeplexcom/json/下载这个dll并添加这个引用
//json序列化
string result = jsonconvertserializeobject(user);
consolewriteline("使用jsonconvert序列化后的结果:{0},长度:{1}", result, resultlength);
//使用linq to json
jobject jobject = jobjectparse(result);
jtoken token = jobject["urls"];
list<string> urllist =new list<string>();
foreach (jtoken t in token)
{
urllistadd(ttostring());
}
consolewrite("使用linq to json反序列化后的结果:[");
for (int i =0; i < urllistcount -1;i++ )
{
consolewrite(urllist[i] +",");
}
consolewriteline(urllist[urllistcount -1] +"]");
}
}
[datacontract]
publicclass user
{
///<summary>
/// 编号
///</summary>
[datamember]
publicint userid { get; set; }
///<summary>
/// 用户名
///</summary>
[datamember]
publicstring username { get; set; }
///<summary>
/// 创建时间
///</summary>
[datamember]
[jsonconverter(typeof(isodatetimeconverter))]
public datetime createdate { get; set; }
///<summary>
/// 生日
///</summary>
[datamember]
[jsonconverter(typeof(javascriptdatetimeconverter))]
public datetime birthday { get; set; }
///<summary>
/// 相关url
///</summary>
[datamember]
public list<string> urls { get; set; }
///<summary>
/// 薪水
///</summary>
[scriptignore]//使用javascriptserializer序列化时不序列化此字段
[ignoredatamember]//使用datacontractjsonserializer序列化时不序列化此字段
[jsonignore]//使用jsonconvert序列化时不序列化此字段
publicint salary { get; set; }
///<summary>
/// 权利级别
///</summary>
[datamember]
public priority priority { get; set; }
public user()
{
urls =new list<string>();
}
}
///<summary>
/// 权利级别
///</summary>
publicenum priority:byte
{
lowest=0x1,
belownormal=0x2,
normal=0x4,
abovenormal=0x8,
highest=0x16
}
}

程序的运行结果如下
1.使用javascriptserializer序列化后的结果:{"userid":1,"username":"李刚","createdate":"\/date(353521211984)\/","birthday":"\/date(-277630788015)\/","urls":[],"priority":22},长度:127
2.使用javascriptserializer反序列化后的结果:userid:1,username:李刚,createdate:1981-3-15 16:20:11,priority:highest
3.使用datacontractjsonserializer序列化后的结果:{"birthday":"\/date(-277630787953+0800)\/","createdate":"\/date(353521212046+0800)\/","priority":8,"urls":[],"userid":1,"username":"李刚"},长度:136
4.使用datacontractjsonserializer反序列化后的结果:userid:1,username:李刚,createdate:1981-3-16 0:20:12,priority:abovenormal
5.使用jsonconvert序列化后的结果:{"userid":1,"username":"李刚","createdate":"1981-03-16t00:20:12.1875+08:00","birthday":new date(-277630787812),"urls":[],"priority":2},长度:132
6.使用jsonconvert反序列化后的结果:userid:1,username:李刚,createdate:1981-3-16 0:20:12,priority:belownormal
7.使用jsonconvert序列化后的结果:{"userid":1,"username":"周公","createdate":"2003-03-16t00:20:12.40625+08:00","birthday":new date(290362812406),"urls":["http://office.jb51.net","//www.jb51.net/web"],"priority":1},长度:198
8.使用linq to json反序列化后的结果:["http://office.jb51.net",//www.jb51.net/web]

总结:通过上面的例子大家可以看出newtonsoft类库提供的json序列化和反序列的方式更加灵活,在实际开发中周公也一直使用newtonsoft作为json序列化和反序列化的不二选择。