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);

序列化的时候同样不区分对象或是数组。

 

它与(二)的区别,据说是效率问题(二效率更高),没有具体考证过。

 

posted on 2014-11-14 13:19  邓绍俊  阅读(4369)  评论(1编辑  收藏  举报

导航