C#解析json的⼏种⽅式
json格式的数据是javascript原⽣的⼀种数据格式,⽐xml更简洁。
它有两种形式:json对象和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);
序列化的时候同样不区分对象或是数组。
它与(⼆)的区别,据说是效率问题(⼆效率更⾼),没有具体考证过。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。