一個.NET通用JSON解析/構建類的實現(c#)轉

轉自: http://www.cnblogs.com/xfrog/archive/2010/04/07/1706754.html

NET通用JSON解析/構建類的實現(c#)

在.NET Framework 3.5中已經提供了一個JSON對象的序列化工具,可是他是強類型的,必須先按JSON對象的格式定義一個類型,並將類型加上JSON序列化特性。本文將試圖提供一個高度靈活的JSON通用類型(JsonObject),實現對JSON的解析及序列化。 html

假設JSON對象內容以下: 編程

隱藏行號 複製代碼 JSON
  1. {
  2.     orders: {
  3.         date: '21:31:59',
  4.         name: 'Xfrog',
  5.         books: [{
  6.             name: 'C# 網絡核心編程',
  7.             publish: '2010-3-24'
  8.         }, {
  9.             name: 'C#入門經典中文版',
  10.             publish: '2009-10-16'
  11.         }]
  12.     },
  13.     blog: 'http://www.cnblogs.com/xfrog'
  14. }

 

使用JsonObject來構建,可選擇如下三種方式:
方式一: json

隱藏行號 複製代碼 C#
  1. //經過標準構造函數
    
  2. JsonObject json = new JsonObject();
    
  3. json["orders"] = new JsonProperty(new JsonObject());
    
  4. json["blog"] = new JsonProperty("http://www.cnblogs.com/xfrog");
    
  5.  
  6. JsonObject config = json.Properties<JsonObject>("orders");
    
  7. json["orders"]["date"] = new JsonProperty(DateTime.Now.ToLongTimeString());
    
  8. json["orders"]["name"] = new JsonProperty("Xfrog");
    
  9. json["orders"]["books"] = new JsonProperty();
    
  10.  
  11. JsonProperty book = json["orders"]["books"].Add(new JsonObject());
    
  12. book["name"] = new JsonProperty("C# 網絡核心編程");
    
  13. book["publish"] = new JsonProperty("2010-3-24");
    
  14.  
  15. book = json["orders"]["books"].Add(new JsonObject());
    
  16. book["name"] = new JsonProperty("C#入門經典中文版");
    
  17. book["publish"] = new JsonProperty("2009-10-16");
    

 


方式二: c#

隱藏行號 複製代碼 C#
  1. //經過回調函數簡化對象的構建
    
  2. JsonObject json2 = new JsonObject((a) =>
    
  3. {
    
  4.     a["orders"] = new JsonProperty(new JsonObject((b) =>
    
  5.     {
    
  6.         b["date"] = new JsonProperty(DateTime.Now.ToLongTimeString());
    
  7.         b["name"] = new JsonProperty("Xfrog");
    
  8.         b["books"] = new JsonProperty();
    
  9.         b["books"].Add(new JsonObject((c) =>
    
  10.         {
    
  11.             c["name"] = new JsonProperty("C# 網絡核心編程");
    
  12.             c["publish"] = new JsonProperty("2010-3-24");
    
  13.         }));
    
  14.         b["books"].Add(new JsonObject((c) =>
    
  15.         {
    
  16.             c["name"] = new JsonProperty("C#入門經典中文版");
    
  17.             c["publish"] = new JsonProperty("2009-10-16");
    
  18.         }));
    
  19.     }));
    
  20.     a["blog"] = new JsonProperty("http://www.cnblogs.com/xfrog");
    
  21. });
    

 

方式三: 網絡

隱藏行號 複製代碼 C#
  1. //經過字符串構建Json對象
    
  2. JsonObject newObj = new JsonObject(jsonStr);
    

 


獲取Json對象屬性值的方法,也有三種方式: 函數

隱藏行號 複製代碼 C#
  1. //經過泛型函數
    
  2. Console.WriteLine(newObj["orders"].GetValue<JsonObject>()["books"].GetValue<List<JsonProperty>>()[1].GetValue<JsonObject>()["name"].Value);
    
  3. //經過屬性類型對應的屬性
    
  4. Console.WriteLine(newObj["orders"].Object["books"].Items[1].Object["name"].Value);
    
  5. //若是屬性爲對象類型,可經過字符串索引簡化
    
  6. Console.WriteLine(newObj["orders"]["books"][1]["name"].Value);
    

 

直接使用ToString函數,將JsonObject轉換爲Json字符串: 工具

隱藏行號 複製代碼 C#
  1. String jsonStr = json.ToString();
    

 

注意: post

我在重載ToString函數時,並無將字符串轉換爲JavsScript字符串類型(即對須要轉義的字符的處理),固然,要實現也是極其簡單的。另外,對於帶String參數的ToString,我也爲作特殊處理,感興趣的朋友可自行實現。this

 

Technorati 標籤: .NET, JSON, C#

 

源代碼下載url

相關文章
相關標籤/搜索