JSON.NET(http://json.codeplex.com/)使用來将.NET中的對象轉換為JSON字元串(序列化?),或者将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); }}

初始化對象:

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的轉換:
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到鍵值對的轉換:

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

輸出結果:
Name1:小明
Name2:小花
Name3:小紅
從字元串轉換到JSON對象,以及JSON對象的簡單使用:

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對象:

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

輸出結果:
{
"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對象

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

結果:
除此之外,還可以通過一下方式來擷取JObject.JArray類似。
方法 | 說明 |
JObject.Parse(string json) | json含有JSON對象的字元串,傳回為JObject對象 |
JObject.FromObject(object o) | o為要轉化的對象,傳回一個JObject對象 |
JObject.Load(JsonReader reader) | reader包含着JSON對象的内容,傳回一個JObject對象 |
2.建立JSON數組

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

結果:
三.使用Linq to JSON
1.查詢
首先準備Json字元串,是一個包含員工基本資訊的Json
string json = " {\"Name\" : \"Jack\", \"Age\" : 34, \"Colleagues\" : [{\"Name\" : \"Tom\" , \"Age\":44},{\"Name\" : \"Abel\",\"Age\":29}] } ";
①擷取該員工的姓名

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

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

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

"Children()"可以傳回所有數組中的對象
結果:
2.修改
①現在我們發現擷取的json字元串中Jack的年齡應該為35
// 将json轉換為JObject JObject jObj = JObject.Parse(json); jObj[ " Age "] = 35 ; Console.WriteLine(jObj.ToString());
結果:
注意不要通過以下方式來修改:
JObject jObj = JObject.Parse(json); JToken age = jObj[ " Age " ]; age = 35;
②現在我們發現Jack的同僚Tom的年齡錯了,應該為45

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

結果:
3.删除
①現在我們想删除Jack的同僚
JObject jObj = JObject.Parse(json); jObj.Remove( " Colleagues " );//跟的是屬性名稱 Console.WriteLine(jObj.ToString());
結果:
②現在我們發現Abel不是Jack的同僚,要求從中删除
JObject jObj = JObject.Parse(json); jObj[ " Colleagues "][ 1 ].Remove(); Console.WriteLine(jObj.ToString());
結果:
4.添加
①我們發現Jack的資訊中少了部門資訊,要求我們必須添加在Age的後面
// 将json轉換為JObject JObject jObj = JObject.Parse(json); jObj[ " Age "].Parent.AddAfterSelf( newJProperty( " Department ", " Personnel Department " )); Console.WriteLine(jObj.ToString());
結果:
②現在我們又發現,Jack公司來了一個新同僚Linda

// 将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());

結果:
四.簡化查詢語句
使用函數SelectToken可以簡化查詢語句,具體:
①利用SelectToken來查詢名稱
JObject jObj = JObject.Parse(json); JToken name = jObj.SelectToken( " Name " ); Console.WriteLine(name.ToString());
結果:
②利用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轉換為JObject JObject jObj = JObject.Parse(json); var age = jObj.SelectToken( " Colleagues[1].Age " ); Console.WriteLine(age.ToString());
結果:
FAQ
1.如果Json中的Key是變化的但是結構不變,如何擷取所要的内容?
例如:

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 }

其中的"2013-05-31 14:31"是變化的key,如何擷取其中的"name","query","amount","delta"等資訊呢?
通過Linq可以很簡單地做到:

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