Json序列化之.NET开源类库Newtonsoft.Json的研究
2014-11-09 23:48
337 查看
一、Json简介
二、Json的序列化和反序列化
方式一:从头开始,自己写方法
Json的格式并不复杂,序列化和反序列化我们完全可以自己来写一套方法来处理Json。但是如果没有特殊业务需求,没有人会这样做,毕竟随着项目的推进,这个方法可能会变得越来越复杂。
方法二:使用开源类库
下面跟大家推荐一款.NET中开源的Json序列化和反序列化类库,Newtonsoft.Json(下载地址http://json.codeplex.com/)。打开网站如下:
点击Download,即可下载次类库。下载完成后,解压完成后可以看到如下目录:
打开Bin目录,会看到不同版本的dll文件,这里我选择Net40,复制Newtonsoft.Json.dll和Newtonsoft.Json.xml到项目下面。最常用的是JObject,JsonReader,JsonWriter来处理Json字符串,这几种方式比较灵活。下面我们来建一个项目来介绍一下Newtonsoft.Json的具体用法。
三、实战Json序列化和反序列化
1、解析Json(反序列化)
打开VS,新建控制台项目JsonWithNewtonsoft,这里我用的是VS2013,然后建立文件夹library来放我们引用的dll,建好的项目结构如下图:
然后我们添加引用usingNewtonsoft.Json;下面我们来看看怎么使用吧!是不是此刻心情很激动啊~~呵呵,先来看看怎么读取Json吧,我们自己写一个Json字符串,来解析一下,这里给出几种用法,大家根据自己爱好选择。
上代码,先来看第一种读取Json的写法,顺序读取:
其输出内容如下:
可以看到,他是顺序解析Json,首先输出Json开始标志StartObject,然后依次输出Json的内容。
下面来看第二种解析Json的方法:
这里使用JObject来解析Json数据,可以看到这里使用linq取出了Json的Name和Value属性,然后将结果赋给values数组,输出结果如下:
这就是解析Json的两种方法,一种是使用StringReader,一种是使用JObject。
解析数组型数据
到这里Json解析就完了?当然没完!这只是解析最基本的Json数据格式,下面来看下解析数组格式的Json数据,代码如下:
这里我们定义了两个学生,这里使用JArray这个类型,可以看到,他和数组的用法很像。当然还可以转换成JObject类型,然后再进行取值操作。
解析嵌套性数据
还有一种Json格式,是嵌套格式,来看下如何解析吧。代码如下:
代码很简单,我就不过多的解释了。
到这里,读取和解析Json的内容就讲完了,下面我们来说一下序列化,就是生成Json的方法。
2、序列化Json
先来看一下通用的生成Json的方法吧!就来输出{"Name":"Jack","Age":"26"}代码如下:
这段代码运行后就是输出{"Name":"Jack","Age":"26"},很简单吧!
下面来添加一个Student类,代码如下,然后对其进行序列化,Student代码:
下面来new一个Student,并进行序列化和反序列化,代码如下:
其输出结果如下:
下面来序列化一个Student列表,看看得到什么,代码如下:
运行结果如下:
看到这个,很熟悉吧,前面刚刚说过怎么解析这种格式的Json!当然,你们还有一种嵌套形式怎么生成呢?下面来修改Studnet类,添加电话号码字段,修改后的Student类如下:
序列化代码如下:
输出Json如下:
看到了吧,是不是前面说到的嵌套类型。解析方法前面也说过了。到这里,Newtonsoft.Json这个类库的使用就讲完了,当然他还有很多其他的功能等待着大家去发现。
如果大家赶紧这篇文章对你有用,请推荐一下或关注我,大家的支持是我最大的动力!
作者:雲霏霏
博客地址:http://www.cnblogs.com/yunfeifei/
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
JSON(全称为JavaScriptObjectNotation)是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。JSON采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生成。
JSON与XML的比较
◆可读性
JSON和XML的可读性相比较而言,由于XML提供辅助的标签,更加适合人阅读和理解。
◆文件大小与传输
XML允许使用方便的标签,所以文件尺寸是要比JSON大的。而且JSON源于Javascript,所以天生的主战场是Javascript与网络,在这里,JSON有着XML无法赶超的优势。
JSON语法
1、JSON语法是JavaScript对象表示法语法的子集。
•数据在名称/值对中:名称是字符串,使用双引号表示。值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在方括号中),对象(在花括号中),
true
/
false
/
null
。
•数据由逗号分隔:
•花括号保存对象:对象可以包含各种数据,包括数组。
•方括号保存数组:数字可以包含对象。
例如:
{
"student"
:[
{
"firstName"
:
"Bill"
,
"lastName"
:
"Gates"
},
{
"grade"
:
"3"
,
"sex"
:
"boy"
}
]
}
二、Json的序列化和反序列化
方式一:从头开始,自己写方法
Json的格式并不复杂,序列化和反序列化我们完全可以自己来写一套方法来处理Json。但是如果没有特殊业务需求,没有人会这样做,毕竟随着项目的推进,这个方法可能会变得越来越复杂。
方法二:使用开源类库
下面跟大家推荐一款.NET中开源的Json序列化和反序列化类库,Newtonsoft.Json(下载地址
点击Download,即可下载次类库。下载完成后,解压完成后可以看到如下目录:
打开Bin目录,会看到不同版本的dll文件,这里我选择Net40,复制Newtonsoft.Json.dll和Newtonsoft.Json.xml到项目下面。最常用的是JObject,JsonReader,JsonWriter来处理Json字符串,这几种方式比较灵活。下面我们来建一个项目来介绍一下Newtonsoft.Json的具体用法。
三、实战Json序列化和反序列化
1、解析Json(反序列化)
打开VS,新建控制台项目JsonWithNewtonsoft,这里我用的是VS2013,然后建立文件夹library来放我们引用的dll,建好的项目结构如下图:
然后我们添加引用usingNewtonsoft.Json;下面我们来看看怎么使用吧!是不是此刻心情很激动啊~~呵呵,先来看看怎么读取Json吧,我们自己写一个Json字符串,来解析一下,这里给出几种用法,大家根据自己爱好选择。
上代码,先来看第一种读取Json的写法,顺序读取:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingNewtonsoft.Json;
usingSystem.IO;
usingNewtonsoft.Json.Linq;
namespaceJsonWithNewtonsoft
{
classProgram
{
staticvoidMain(string[]args)
{
stringjsonText=@"{""Name"":""Jack"",""Age"":""22""}";
JsonReaderreader=newJsonTextReader(newStringReader(jsonText));
while(reader.Read())
{
Console.WriteLine(reader.TokenType+"\t"+reader.ValueType+"\t"+reader.Value);
}
Console.Read();
}
}
}
其输出内容如下:
可以看到,他是顺序解析Json,首先输出Json开始标志StartObject,然后依次输出Json的内容。
下面来看第二种解析Json的方法:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingNewtonsoft.Json;
usingSystem.IO;
usingNewtonsoft.Json.Linq;
namespaceJsonWithNewtonsoft
{
classProgram
{
staticvoidMain(string[]args)
{
stringjsonText=@"{""Name"":""Jack"",""Age"":""22""}";
JObjectjo=JObject.Parse(jsonText);
string[]values=jo.Properties().Select(item=>item.Name.ToString()+":"+item.Value.ToString()).ToArray();
foreach(stringsinvalues)
{
Console.WriteLine(s);
}
Console.Read();
}
}
}
这里使用JObject来解析Json数据,可以看到这里使用linq取出了Json的Name和Value属性,然后将结果赋给values数组,输出结果如下:
这就是解析Json的两种方法,一种是使用StringReader,一种是使用JObject。
解析数组型数据
到这里Json解析就完了?当然没完!这只是解析最基本的Json数据格式,下面来看下解析数组格式的Json数据,代码如下:
//数组型数据
stringjsonArrayText1="[{'Name':'Tom','Age':'16'},{'Name':'Mary','Age':'15'}]";
JArrayja=(JArray)JsonConvert.DeserializeObject(jsonArrayText1);
stringname1=ja[1]["Name"].ToString();
Console.WriteLine(name1);
//或者
JObjecto=(JObject)ja[1];
stringname2=o["Name"].ToString();
Console.WriteLine(name2);
这里我们定义了两个学生,这里使用JArray这个类型,可以看到,他和数组的用法很像。当然还可以转换成JObject类型,然后再进行取值操作。
解析嵌套性数据
还有一种Json格式,是嵌套格式,来看下如何解析吧。代码如下:
//嵌套格式
jsonText="{\"shanghai\":{\"zone\":\"浦东\",\"zone_en\":\"pudong\"}}";
jo=(JObject)JsonConvert.DeserializeObject(jsonText);
stringzone=jo["shanghai"]["zone"].ToString();
stringzone_en=jo["shanghai"]["zone_en"].ToString();
代码很简单,我就不过多的解释了。
到这里,读取和解析Json的内容就讲完了,下面我们来说一下序列化,就是生成Json的方法。
2、序列化Json
先来看一下通用的生成Json的方法吧!就来输出{"Name":"Jack","Age":"26"}代码如下:
//输出{"Name":"Jack","Age":"26"}
StringWritersw=newStringWriter();
JsonWriterwriter=newJsonTextWriter(sw);
writer.WriteStartObject();
writer.WritePropertyName("Name");
writer.WriteValue("Jack");
writer.WritePropertyName("Age");
writer.WriteValue("26");
writer.WriteEndObject();
writer.Flush();
jsonText=sw.GetStringBuilder().ToString();
Console.WriteLine(jsonText);
这段代码运行后就是输出{"Name":"Jack","Age":"26"},很简单吧!
下面来添加一个Student类,代码如下,然后对其进行序列化,Student代码:
publicclassStudent
{
publicstringName{get;set;}
publicintAge{get;set;}
}
下面来new一个Student,并进行序列化和反序列化,代码如下:
Studentstu=newStudent(){Name="Jack",Age=20};
JsonSerializerserializer=newJsonSerializer();
sw=newStringWriter();
serializer.Serialize(newJsonTextWriter(sw),stu);
Console.WriteLine(sw.GetStringBuilder().ToString());
StringReadersr=newStringReader(sw.GetStringBuilder().ToString());
Students=(Student)serializer.Deserialize(newJsonTextReader(sr),typeof(Student));
Console.WriteLine(s.Name+"=>"+s.Age);
其输出结果如下:
下面来序列化一个Student列表,看看得到什么,代码如下:
List<Student>students=newList<Student>();
Studentstu=newStudent(){Name="Jack",Age=20};
Studentstu1=newStudent(){Name="Tom",Age=21};
students.Add(stu);
students.Add(stu1);
JsonSerializerserializer=newJsonSerializer();
sw=newStringWriter();
serializer.Serialize(newJsonTextWriter(sw),students);
Console.WriteLine(sw.GetStringBuilder().ToString());
运行结果如下:
看到这个,很熟悉吧,前面刚刚说过怎么解析这种格式的Json!当然,你们还有一种嵌套形式怎么生成呢?下面来修改Studnet类,添加电话号码字段,修改后的Student类如下:
publicclassStudent
{
publicstringName{get;set;}
publicintAge{get;set;}
publicList<string>Phones{get;set;}
}
序列化代码如下:
List<Student>students=newList<Student>();
Studentstu=newStudent(){Name="Jack",Age=20,Phones=newList<string>{"1455655888","15236988985"}};
Studentstu1=newStudent(){Name="Tom",Age=21,Phones=newList<string>{"1325889684","15236988985"}};
students.Add(stu);
students.Add(stu1);
JsonSerializerserializer=newJsonSerializer();
sw=newStringWriter();
serializer.Serialize(newJsonTextWriter(sw),students);
Console.WriteLine(sw.GetStringBuilder().ToString());
输出Json如下:
看到了吧,是不是前面说到的嵌套类型。解析方法前面也说过了。到这里,Newtonsoft.Json这个类库的使用就讲完了,当然他还有很多其他的功能等待着大家去发现。
如果大家赶紧这篇文章对你有用,请推荐一下或关注我,大家的支持是我最大的动力!
作者:
博客地址:http://www.cnblogs.com/yunfeifei/
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
相关文章推荐
- Json序列化之.NET开源类库Newtonsoft.Json的研究
- Json序列化之.NET开源类库Newtonsoft.Json的研究
- Json序列化之.NET开源类库Newtonsoft.Json的研究
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
- .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
- .Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
- ASP.NET 中JSON “.NET研究”的序列化和反序列化
- .net序列化 - Newtonsoft(Json.Net)简单应用
- 在.NET中使用Newtonsoft.Json
- Newtonsoft.Json序列化和反序列
- .NET模型序列化json数据
- .NET Framewok 3.5 中 JSON 序列化和反序列化的简单实现
- JSON 序列化和反序列化——.net3.5自带类库实现
- .net 模型序列化json数据
- .net Json对象序列化和反序列化
- ESBasic 可复用的.NET类库(00) -- 开源前言(附下载)
- ESBasic 可复用的.NET类库(00) -- 开源前言
- .Net开源PDF类库 itextsharp 测试
- .NET Framewok 3.5 中 JSON 序列化和反序列化的简单实现