一个.NET通用JSON解析/构建类的实…

一个.NET通用JSON解析/构建类的实现(c#)

在.NET Framework 3.5中已经提供了一个JSON对象的序列化工具,但是他是强类型的,必须先按JSON对象的格式定义一个类型,并将类型加上JSON序列化特性。本文将试图提供一个高度灵活的JSON通用类型(JsonObject),实现对JSON的解析及序列化。

假设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来构建,可选择以下三种方式:
方式一:

隐藏行号 复制代码 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. JsonObject config = json.Properties<<SPAN style="COLOR: rgb(43,145,175)">JsonObject>("orders");
    
  6. json["orders"]["date"] = new JsonProperty(DateTime.Now.ToLongTimeString());
    
  7. json["orders"]["name"] = new JsonProperty("Xfrog");
    
  8. json["orders"]["books"] = new JsonProperty();
    
  9. JsonProperty book = json["orders"]["books"].Add(new JsonObject());
    
  10. book["name"] = new JsonProperty("C# 网络核心编程");
    
  11. book["publish"] = new JsonProperty("2010-3-24");
    
  12. book = json["orders"]["books"].Add(new JsonObject());
    
  13. book["name"] = new JsonProperty("C#入门经典中文版");
    
  14. book["publish"] = new JsonProperty("2009-10-16");
    


方式二:

隐藏行号 复制代码 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<<SPAN style="COLOR: rgb(43,145,175)">JsonObject>()["books"].GetValue<<SPAN style="COLOR: rgb(43,145,175)">List<<SPAN style="COLOR: rgb(43,145,175)">JsonProperty>>()[1].GetValue<<SPAN style="COLOR: rgb(43,145,175)">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();
    

注意:

我在重载ToString函数时,并没有将字符串转换为JavsScript字符串类型(即对需要转义的字符的处理),当然,要实现也是极其简单的。另外,对于带String参数的ToString,我也为做特殊处理,感兴趣的朋友可自行实现。

Technorati 标签: .NET, JSON, C#

你可能感兴趣的:(一个.NET通用JSON解析/构建类的实…)