打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Json序列化之.NET开源类库Newtonsoft.Json的研究

一、Json简介                                                                                                                   

JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于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(下载地址 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,建好的项目结构如下图:

然后我们添加引用 using Newtonsoft.Json;下面我们来看看怎么使用吧!是不是此刻心情很激动啊~~呵呵,先来看看怎么读取Json吧,我们自己写一个Json字符串,来解析一下,这里给出几种用法,大家根据自己爱好选择。

上代码,先来看第一种读取Json的写法,顺序读取:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Newtonsoft.Json;using System.IO;using Newtonsoft.Json.Linq;namespace JsonWithNewtonsoft{  class Program  {    static void Main(string[] args)    {      string jsonText = @"{""Name"" : ""Jack"", ""Age"" : ""22""}";      JsonReader reader = new JsonTextReader(new StringReader(jsonText));      while (reader.Read())      {        Console.WriteLine(reader.TokenType + "\t" + reader.ValueType + "\t" + reader.Value);      }      Console.Read();    }  }}

其输出内容如下:

可以看到,他是顺序解析Json,首先输出Json开始标志StartObject,然后依次输出Json的内容。

下面来看第二种解析Json的方法:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Newtonsoft.Json;using System.IO;using Newtonsoft.Json.Linq;namespace JsonWithNewtonsoft{  class Program  {    static void Main(string[] args)    {      string jsonText = @"{""Name"" : ""Jack"", ""Age"" : ""22""}";      JObject jo = JObject.Parse(jsonText);      string[] values = jo.Properties().Select(item => item.Name.ToString() + ":" + item.Value.ToString()).ToArray();      foreach(string s in values)      {        Console.WriteLine(s);      }      Console.Read();    }  }}

这里使用JObject来解析Json数据,可以看到这里使用linq取出了Json的Name和Value属性,然后将结果赋给values数组,输出结果如下:

这就是解析Json的两种方法,一种是使用StringReader,一种是使用JObject。

解析数组型数据

到这里Json解析就完了?当然没完!这只是解析最基本的Json数据格式,下面来看下解析数组格式的Json数据,代码如下:

  //数组型数据  string jsonArrayText1 = "[{'Name':'Tom','Age':'16'},{'Name':'Mary','Age':'15'}]";  JArray ja = (JArray)JsonConvert.DeserializeObject(jsonArrayText1);  string name1 = ja[1]["Name"].ToString();  Console.WriteLine(name1);  //或者  JObject o = (JObject)ja[1];  string name2 = o["Name"].ToString();  Console.WriteLine(name2);

这里我们定义了两个学生,这里使用JArray这个类型,可以看到,他和数组的用法很像。当然还可以转换成JObject类型,然后再进行取值操作。

解析嵌套性数据

还有一种Json格式,是嵌套格式,来看下如何解析吧。代码如下:

     //嵌套格式            jsonText = "{\"shanghai\":{\"zone\":\"浦东\",\"zone_en\":\"pudong\"}}";            jo = (JObject)JsonConvert.DeserializeObject(jsonText);            string zone = jo["shanghai"]["zone"].ToString();            string zone_en = jo["shanghai"]["zone_en"].ToString();

代码很简单,我就不过多的解释了。

到这里,读取和解析Json的内容就讲完了,下面我们来说一下序列化,就是生成Json的方法。

2、序列化Json

先来看一下通用的生成Json的方法吧!就来输出{"Name":"Jack","Age":"26"}代码如下:

      //输出{"Name":"Jack","Age":"26"}  StringWriter sw = new StringWriter();  JsonWriter writer = new JsonTextWriter(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代码:

public class Student    {        public string Name { get; set; }        public int Age { get; set; }    }

下面来new一个Student,并进行序列化和反序列化,代码如下:

Student stu = new Student() { Name = "Jack", Age = 20 };  JsonSerializer serializer = new JsonSerializer();  sw = new StringWriter();  serializer.Serialize(new JsonTextWriter(sw), stu);  Console.WriteLine(sw.GetStringBuilder().ToString());  StringReader sr = new StringReader(sw.GetStringBuilder().ToString());  Student s = (Student)serializer.Deserialize(new JsonTextReader(sr), typeof(Student));  Console.WriteLine(s.Name + "=>" + s.Age);

其输出结果如下:

下面来序列化一个Student列表,看看得到什么,代码如下:

        List<Student> students = new List<Student>();  Student stu = new Student() { Name = "Jack", Age = 20 };  Student stu1 = new Student() { Name = "Tom", Age = 21 };  students.Add(stu);  students.Add(stu1);  JsonSerializer serializer = new JsonSerializer();  sw = new StringWriter();  serializer.Serialize(new JsonTextWriter(sw), students);  Console.WriteLine(sw.GetStringBuilder().ToString());

运行结果如下:

看到这个,很熟悉吧,前面刚刚说过怎么解析这种格式的Json!当然,你们还有一种嵌套形式怎么生成呢?下面来修改Studnet类,添加电话号码字段,修改后的Student类如下:

public class Student  {    public string Name { get; set; }    public int Age { get; set; }    public List<string> Phones { get; set; }  }

序列化代码如下:

       List<Student> students = new List<Student>();  Student stu = new Student() { Name = "Jack", Age = 20, Phones = new List<string> {"1455655888","15236988985" }};  Student stu1 = new Student() { Name = "Tom", Age = 21, Phones = new List<string> { "1325889684", "15236988985" }};  students.Add(stu);  students.Add(stu1);  JsonSerializer serializer = new JsonSerializer();  sw = new StringWriter();  serializer.Serialize(new JsonTextWriter(sw), students);  Console.WriteLine(sw.GetStringBuilder().ToString());

输出Json如下:

看到了吧,是不是前面说到的嵌套类型。解析方法前面也说过了。到这里,Newtonsoft.Json这个类库的使用就讲完了,当然他还有很多其他的功能等待着大家去发现。

作者:雲霏霏

博客地址:http://www.cnblogs.com/yunfeifei/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
在.NET中使用Newtonsoft.Json转换,读取,写入
Newtonsoft.Json解析json字符串和写json字符串
C# 操作JSON的几种方式
C# 后台解析json,简单方法 字符串序列化为对象,取值
.Net使用Newtonsoft.Json.dll(JSON.NET)对象序列化成json、反序列化json示例教程
[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服