天天看點

JSON.NET 簡單的使用

JSON.NET(http://json.codeplex.com/)使用來将.NET中的對象轉換為JSON字元串(序列化?),或者将JSON字元串轉換為.NET中已有類型的對象(反序列化?)

首先為了例子随便定義一個類型:

JSON.NET 簡單的使用

public  class  Product{  public  string Name {  get;  set ; }  public DateTime Expiry {  get;  set ; }  public  decimal Price { get;  set ; }  public  string[] Sizes {  get;  set ; }  public  override  string  ToString() {  return  string.Format( " Name:{0},Expiry:{1},Price:{2},SizesCount:{3} "  , Name, Expiry, Price, Sizes.Length); }}

JSON.NET 簡單的使用

初始化對象:

JSON.NET 簡單的使用

public  static  void Main( string [] passwordargs){ Product product =  new  Product() { Name =  " android " , Expiry = DateTime.Now, Price =  2000 , Sizes =  new  string[] {  " 1.5 ",  " 2.2 ",  " 4.1 "  } };}

JSON.NET 簡單的使用

進行到JSON的轉換:

Console.WriteLine(JsonConvert.SerializeObject(product));

輸出結果:

{"Name":"android","Expiry":"2013-08-30T09:50:11.5147845+08:00","Price":2000.0,"Sizes":["1.5","2.2","4.1"]}

其它看起來一切正常,除了這個日期有點怪

格式化日期:

// 設定日期時間的格式,與DataTime類型的ToString格式相同IsoDateTimeConverter iso =  new IsoDateTimeConverter();iso.DateTimeFormat =  " yyyy-MM-dd HH:mm:ss " ;Console.WriteLine(JsonConvert.SerializeObject(product, iso));

輸出結果:

{"Name":"android","Expiry":"2013-08-30 09:53:58","Price":2000.0,"Sizes":["1.5","2.2","4.1"]}

從JSON到對象的轉換:

string str =  " {\"Name\":\"android\",\"Expiry\":\"2013-08-30 09:53:58\",\"Price\":2000.0,\"Sizes\":[\"1.5\",\"2.2\",\"4.1\"]} " ;Product p = (Product)JsonConvert.DeserializeObject(str, typeof (Product));Console.WriteLine(p.ToString());

輸出結果:

Name:android,Expiry:2013/8/30 9:53:58,Price:2000.0,SizesCount:3

從JSON到鍵值對的轉換:

JSON.NET 簡單的使用

string strJson =  @" {""Name1"": ""小明"",""Name2"": ""小花"",""Name3"": ""小紅""} " ;Dictionary< string,  string> _dictionary = JsonConvert.DeserializeObject<Dictionary< string,  string>> (strJson); foreach(KeyValuePair< string,  string> kp  in  _dictionary){ Console.WriteLine(kp.Key +  " : " +  kp.Value);}

JSON.NET 簡單的使用

輸出結果:

Name1:小明 

Name2:小花 

Name3:小紅

從字元串轉換到JSON對象,以及JSON對象的簡單使用:

JSON.NET 簡單的使用

string strJson2 =  @" { ""student"": { ""Name1"": ""小明"" , ""Name2"": ""小花"" , ""Name3"": ""小紅""} } " ;JObject jsonObj =  JObject.Parse(strJson2);Console.WriteLine(jsonObj[ " student "][ " Name1 " ].ToString());Console.WriteLine(jsonObj[ " student "][ " Name2 " ].ToString());Console.WriteLine(jsonObj[ " student "][ " Name3 "].ToString());

JSON.NET 簡單的使用

輸出結果:

小明 

小花 

小紅

直接生成JSON對象:

JSON.NET 簡單的使用

JObject json =  new  JObject(  new JProperty( " Channel " ,  new  JObject(  new JProperty( " title ",  " JSON " ),  newJProperty( " link ",  " JSON.NET " ),  new JProperty( " description ",  " JSON.NET Description " ),  new JProperty( " items " , new  JArray(  new JObject( new JProperty( " haha1 ",  " 123 " )),  new JObject( new JProperty( " haha2 ",  " 456 " )),  newJObject( new JProperty( " haha3 ",  " 789 " )) )))));Console.WriteLine(json.ToString());

JSON.NET 簡單的使用

輸出結果:

"Channel": { 

"title": "JSON", 

"link": "JSON.NET", 

"description": "JSON.NET Description", 

"items": [ 

"haha1": "123" 

}, 

"haha2": "456" 

}, 

"haha3": "789" 

}

======================================

一.Linq to JSON是用來幹什麼的?

  Linq to JSON是用來操作JSON對象的.可以用于快速查詢,修改和建立JSON對象.當JSON對象内容比較複雜,而我們僅僅需要其中的一小部分資料時,可以考慮使用Linq to JSON來讀取和修改部分的資料而非反序列化全部.

二.建立JSON數組和對象

在進行Linq to JSON之前,首先要了解一下用于操作Linq to JSON的類.

類名 說明
JObject 用于操作JSON對象
JArray 用語操作JSON數組
JValue 表示數組中的值
JProperty 表示對象中的屬性,以"key/value"形式
JToken 用于存放Linq to JSON查詢後的結果

1.建立JSON對象

JSON.NET 簡單的使用

JObject staff =  new  JObject(); staff.Add( new JProperty( " Name ", " Jack " )); staff.Add( new JProperty( " Age ",  33 )); staff.Add( newJProperty( " Department ",  " Personnel Department " )); staff.Add( newJProperty( " Leader ",  new JObject( new JProperty( " Name ",  " Tom "), new JProperty( " Age ",  44),  new JProperty( " Department ",  " Personnel Department " )))); Console.WriteLine(staff.ToString());

JSON.NET 簡單的使用

結果:

JSON.NET 簡單的使用

除此之外,還可以通過一下方式來擷取JObject.JArray類似。

方法   說明
JObject.Parse(string json) json含有JSON對象的字元串,傳回為JObject對象
JObject.FromObject(object o) o為要轉化的對象,傳回一個JObject對象
JObject.Load(JsonReader reader) reader包含着JSON對象的内容,傳回一個JObject對象

2.建立JSON數組

JSON.NET 簡單的使用

JArray arr =  new  JArray(); arr.Add( new JValue( 1 )); arr.Add( new JValue( 2 )); arr.Add( new JValue( 3 )); Console.WriteLine(arr.ToString());

JSON.NET 簡單的使用

結果:

JSON.NET 簡單的使用

三.使用Linq to JSON

1.查詢

首先準備Json字元串,是一個包含員工基本資訊的Json

string json =  " {\"Name\" : \"Jack\", \"Age\" : 34, \"Colleagues\" : [{\"Name\" : \"Tom\" , \"Age\":44},{\"Name\" : \"Abel\",\"Age\":29}] } ";

①擷取該員工的姓名

JSON.NET 簡單的使用

// 将json轉換為JObject JObject jObj =  JObject.Parse(json);  // 通過屬性名或者索引來通路,僅僅是自己的屬性名,而不是所有的 JToken ageToken = jObj[ " Age " ]; Console.WriteLine(ageToken.ToString());

JSON.NET 簡單的使用

結果:

JSON.NET 簡單的使用

②擷取該員工同僚的所有姓名

JSON.NET 簡單的使用

// 将json轉換為JObject JObject jObj =  JObject.Parse(json);  var names= from staff  in jObj[ " Colleagues " ].Children() select ( string)staff[ " Name " ];  foreach ( var name  in  names) Console.WriteLine(name);

JSON.NET 簡單的使用

"Children()"可以傳回所有數組中的對象

結果:

JSON.NET 簡單的使用

2.修改

①現在我們發現擷取的json字元串中Jack的年齡應該為35

// 将json轉換為JObject JObject jObj =  JObject.Parse(json); jObj[ " Age "] =  35 ; Console.WriteLine(jObj.ToString());

結果:

JSON.NET 簡單的使用

注意不要通過以下方式來修改:

JObject jObj =  JObject.Parse(json); JToken age = jObj[ " Age " ]; age =  35;

②現在我們發現Jack的同僚Tom的年齡錯了,應該為45

JSON.NET 簡單的使用

// 将json轉換為JObject JObject jObj =  JObject.Parse(json); JToken colleagues = jObj[ " Colleagues " ]; colleagues[ 0][ " Age "] =  45 ; jObj[ " Colleagues "] =  colleagues;//修改後,再賦給對象 Console.WriteLine(jObj.ToString());

JSON.NET 簡單的使用

結果:

JSON.NET 簡單的使用

3.删除

①現在我們想删除Jack的同僚

JObject jObj =  JObject.Parse(json); jObj.Remove( " Colleagues " );//跟的是屬性名稱 Console.WriteLine(jObj.ToString());

結果:

JSON.NET 簡單的使用

②現在我們發現Abel不是Jack的同僚,要求從中删除

JObject jObj =  JObject.Parse(json); jObj[ " Colleagues "][ 1 ].Remove(); Console.WriteLine(jObj.ToString());

結果:

JSON.NET 簡單的使用

4.添加

①我們發現Jack的資訊中少了部門資訊,要求我們必須添加在Age的後面

// 将json轉換為JObject JObject jObj =  JObject.Parse(json); jObj[ " Age "].Parent.AddAfterSelf( newJProperty( " Department ",  " Personnel Department " )); Console.WriteLine(jObj.ToString());

結果:

JSON.NET 簡單的使用

②現在我們又發現,Jack公司來了一個新同僚Linda

JSON.NET 簡單的使用

// 将json轉換為JObject JObject jObj =  JObject.Parse(json); JObject linda =  new JObject( new JProperty( " Name ", " Linda "),  new JProperty( " Age ",  " 23 " )); jObj[ " Colleagues " ].Last.AddAfterSelf(linda); Console.WriteLine(jObj.ToString());

JSON.NET 簡單的使用

結果:

JSON.NET 簡單的使用

四.簡化查詢語句

使用函數SelectToken可以簡化查詢語句,具體:

①利用SelectToken來查詢名稱

JObject jObj =  JObject.Parse(json); JToken name = jObj.SelectToken( " Name " ); Console.WriteLine(name.ToString());

結果:

JSON.NET 簡單的使用

②利用SelectToken來查詢所有同僚的名字

JObject jObj =  JObject.Parse(json);  var names = jObj.SelectToken( " Colleagues ").Select(p => p[ " Name " ]).ToList(); foreach ( var name  in  names) Console.WriteLine(name.ToString());

結果:

JSON.NET 簡單的使用

③查詢最後一名同僚的年齡

// 将json轉換為JObject JObject jObj =  JObject.Parse(json);  var age = jObj.SelectToken( " Colleagues[1].Age " ); Console.WriteLine(age.ToString());

結果:

JSON.NET 簡單的使用

FAQ

1.如果Json中的Key是變化的但是結構不變,如何擷取所要的内容?

例如:

JSON.NET 簡單的使用

1  {  2  " trends " :  3  {  4  " 2013-05-31 14:31 " :  5  [  6 { " name ": " 我不是誰的偶像 " ,  7  " query ": " 我不是誰的偶像 " ,  8 " amount ": " 65172 " ,  9  " delta ": " 1596 " }, 10 { " name ": " 世界無煙日 ", " query ": " 世界無煙日 ", " amount ": " 33548 ", " delta ": " 1105 " }, 11 { " name ": " 最萌身高差 ", " query ": " 最萌身高差 ", " amount ": " 32089 ", " delta ": " 1069 " }, 12 { " name ": " 中國合夥人 ", " query ": " 中國合夥人 ", " amount ": " 25634 ", " delta ": " 2 " }, 13 { " name ": " exo回歸 ", " query ": " exo回歸 ", " amount ": " 23275 ", " delta ": " 321 " }, 14{ " name ": " 新一吻定情 ", " query ": " 新一吻定情 ", " amount ": " 21506 ", " delta ": " 283 " }, 15 { " name ": " 進擊的巨人 ", " query ": " 進擊的巨人 ", " amount ": " 20358 ", " delta ": " 46 " }, 16 { " name ": " 誰的青春沒缺失 ", " query ": " 誰的青春沒缺失 ", " amount ": " 17441 ", " delta ": " 581 " }, 17 { " name ": " 我愛幸運七 ", " query ": " 我愛幸運七 ", " amount ": " 15051 ", " delta ": " 255 " }, 18 { " name ": " 母愛10平方 ", " query ": " 母愛10平方 ", " amount ": " 14027 ", " delta ": " 453 " } 19  ] 20  }, 21  " as_of ": 1369981898 22 }

JSON.NET 簡單的使用

其中的"2013-05-31 14:31"是變化的key,如何擷取其中的"name","query","amount","delta"等資訊呢?

通過Linq可以很簡單地做到:

JSON.NET 簡單的使用

var jObj =  JObject.Parse(jsonString);  var tends =  from c  in  jObj.First.First.First.First.Children()  selectJsonConvert.DeserializeObject<Trend> (c.ToString()); public  class  Trend{  public  string Name {  get;  set ; }  public string Query {  get;  set ; }  public  string Amount {  get;  set ; }  public  string Delta {  get;  set ; }}

JSON.NET 簡單的使用