当前位置: 移动技术网 > IT编程>开发语言>.net > 在.NET使用JSON作为数据交换格式实例演示

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

2017年12月12日  | 移动技术网IT编程  | 我要评论
我们知道在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序列化和反序列化的不二选择。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网