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