C#解析json的几种方式
json格式的数据是javascript原生的一种数据格式,比xml更简洁。
它有两种形式:json对象和json对象数组。
在此之前,有必要解释几个基本概念:
json字符串,就是string,它一定是由双引号包起来的,如"{'name':'jerry'}"。这是一个string,尽管去掉双引号后它就是一个json对象。
json对象,就是以大括号开头的对象,如{"name":"jerry"}; 而获取name值的方式就是 json.name 或者 json["name"];
json数组,就是以中括号开头的json对象数组,如[{"name":"tom"},{"name":"jerry"}];获取值的方式是 json[0].name 或 json[0]["name"]; //这里取第一个name
搞清楚基本概念后,理解起来就容易了。
而把符合json格式的string,转换成json对象并提取其中值的方法,就是本文要重点介绍的。
(一):引用 newtonsoft.json.linq命名空间
json对象
在C#中可以,利用其JObject类进行一些操作:
string json = "{'name':'terry','age':'21'}"; JObject jsonObj = JObject.Parse(json); //尝试将字符串转换成json对象 string name = jsonObj["name"]; //在js中习惯用jsonObj.name,这里不行 string age = jsonObj["age"]; Response.Write(name + "<br />" + age);
json数组
类似JObject,这里借助JArray类:
string json = "[{'name':'tom'},{'name':'jerry'},8,10]"; JArray arr = JArray.Parse(json); //尝试将字符串转换成json数组 Response.Write(arr[1]["name"]); //输出jerry
其实这个json数组很奇怪,第三个和第四个没有键值对了,就一个值,也是可以解析的:
Response.Write( arr[3] ); //输出10
(二):引用 newtonsoft.json命名空间
1.需要建立与json相对应的类:
public class Person { public string Name { get; set; } public int Age { get; set; } }
2.string转对象
string json = "{'Name':'tom','Age':'21'}"; Person p = JsonConvert.DeserializeObject<Person>(json); //将字符串转换成json对象 Response.Write(p.Name); //输出tom.这里不能p["Name"]
3.string转数组
string json = "[{'Name':'a','Age':1},{'Name':'b','Age':2}]"; List<Person> persons = JsonConvert.DeserializeObject<List<Person>>(json);//用List作为容器装Person数组 Response.Write(persons[0].Name); //输出a.这里不能persons[0]["Name"]
这个把string转换成对象或者数组的过程,叫做反序列化。
说到反序列化,顺便提一下序列化。
序列化,指把对象和数组变为字符串的过程。
例1.
Person p = new Person(){Name="jerry" , Age=23}; string json = JsonConvert.SerializeObject(p);
例2.
List<Person> persons=new List<Person>() { new Person(){ Name="a",Age=1}, new Person(){ Name="b",Age=2}, new Person(){ Name="c",Age=3}, new Person(){ Name="d",Age=4} }; string json = JsonConvert.SerializeObject(persons)
这里不区分JArray和JObject,都是用JsonConvert.SerializeObject()方法;
(三):引用 System.Web.Script.Serialization命名空间
这个的好处在于适合某些没有newtonsoft.dll文件的环境
用法和(二)也差不多,只不过不再是静态方法,而是需要实例化
1.建立与json相对应的类:
public class Person { public string Name { get; set; } public int Age { get; set; } }
2.string转对象
string json = "{'Name':'tom','Age':'21'}"; Person p = (Person)new JavaScriptSerializer().Deserialize(json, new Person().GetType()); //将字符串转换成json对象 Response.Write(p.Name); //输出tom.这里不能p["Name"]
3.string转数组
string json = "[{'Name':'a','Age':1},{'Name':'b','Age':2}]"; List<Person> persons = (List<Person>)new JavaScriptSerializer().Deserialize(json, new List<Person>().GetType());//用List作为容器装Person数组 Response.Write(persons[0].Name); //输出a.这里不能persons[0]["Name"]
这是反序列化,下面讲序列化
例1.
Person p = new Person(){Name="tom" , Age=23}; string json = new JavaScriptSerializer().Serialize(p);
例2.
List<Person> persons=new List<Person>() { new Person(){ Name="a",Age=1}, new Person(){ Name="b",Age=2}, new Person(){ Name="c",Age=3}, new Person(){ Name="d",Age=4} }; string json = new JavaScriptSerializer().Serialize(persons);
序列化的时候同样不区分对象或是数组。
它与(二)的区别,据说是效率问题(二效率更高),没有具体考证过。