400-028-6601
建站资讯

网站建设资讯

为你提供网站建设行业资讯、网站优化知识、主机域名邮箱、网站开发常见问题等。

也谈C#之Json,从Json字符串到类代码

json转类对象

目前创新互联已为上千多家的企业提供了网站建设、域名、网站空间、绵阳服务器托管、企业网站设计、北票网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

自从.net 4.0开始,微软提供了一整套的针对json进行处理的方案。其中,就有如何把json字符串转化成C#类对象,其实这段代码很多人都清楚,大家也都认识,我就不多说,先贴代码。

1、添加引用 System.Web.Extensions

  

2、测试一下代码

 
 
  1. static class Program 
  2.     { 
  3.         ///  
  4.         /// 程序的主入口点。 
  5.         ///  
  6.         static void Main() 
  7.         { 
  8.             string jsonStr = "{\"name\":\"supperlitt\",\"age\":25,\"likes\":[\"C#\",\"asp.net\"]}"; 
  9.             JavaScriptSerializer js = new JavaScriptSerializer(); 
  10.             var model = js.Deserialize(jsonStr); 
  11.  
  12.             Console.WriteLine(model.name); 
  13.             Console.WriteLine(model.age); 
  14.             Console.WriteLine(string.Join(",", model.likes)); 
  15.  
  16.             Console.ReadLine(); 
  17.         } 
  18.  
  19.         public class TestModel 
  20.         { 
  21.             public string name { get; set; } 
  22.  
  23.             public int age { get; set; } 
  24.  
  25.             public List likes { get; set; } 
  26.         } 
  27.     } 

输出内容:

逆思考

由于代码中,经常会遇到需要处理json字符串(抓包比较频繁)。每次遇到json字符串,大多需要解析,又要进行重复劳动,又需要定义一个C#对象类,有没有一个比较好的办法解决呢,不用每次都去写代码。自动生成多好。。。

于是LZ思前,向后,想到了以前用过的一个微软的类库,应该是微软的一个Com库。

      

#p#

 从json字符串自动生成C#类

1、试着百度了一下,也尝试了几个可以使用的类。于是找到了

如下的代码,能够解析一个json字符串,成为一个C#的对象。

这里引用了,Microsoft.JScript.dll 类库。

  
 
  1. Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine(); 
  2. var m = Microsoft.JScript.Eval.JScriptEvaluate("(" + jsonStr + ")", ve); 

 2、发现这个m对象,其实是一个JSObject对象,内部也可以继续进行细分,于是测试了种种,稍后会上源码。先看测试效果吧。

我们随便在web上面找了一个json字符串来进行处理。当然json要稍稍复杂一点。

  

ps:代码如下

 
 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using Microsoft.JScript; 
  6.  
  7. namespace Common 
  8. { 
  9.     ///  
  10.     /// Json字符串zhuanh 
  11.     ///  
  12.     public class JsonHelper : IHelper 
  13.     { 
  14.         ///  
  15.         /// 是否添加get set 
  16.         ///  
  17.         private bool isAddGetSet = false; 
  18.  
  19.         ///  
  20.         /// 数据集合,临时 
  21.         ///  
  22.         private List dataList = new List(); 
  23.  
  24.         public JsonHelper() 
  25.         { 
  26.         } 
  27.  
  28.         public JsonHelper(bool isAddGetSet) 
  29.         { 
  30.             this.isAddGetSet = isAddGetSet; 
  31.         } 
  32.  
  33.         ///  
  34.         /// 获取类的字符串形式 
  35.         ///  
  36.         ///  
  37.         ///  
  38.         public string GetClassString(string jsonStr) 
  39.         { 
  40.             Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine(); 
  41.             var m = Microsoft.JScript.Eval.JScriptEvaluate("(" + jsonStr + ")", ve); 
  42.  
  43.             int index = 0; 
  44.             var result = GetDicType((JSObject)m, ref index); 
  45.  
  46.             StringBuilder content = new StringBuilder(); 
  47.             foreach (var item in dataList) 
  48.             { 
  49.                 content.AppendFormat("\tpublic class {0}\r\n", item.CLassName); 
  50.                 content.AppendLine("\t{"); 
  51.                 foreach (var model in item.Dic) 
  52.                 { 
  53.                     if (isAddGetSet) 
  54.                     { 
  55.                         content.AppendFormat("\t\tpublic {0} {1}", model.Value, model.Key); 
  56.                         content.Append(" { get; set; }\r\n"); 
  57.                     } 
  58.                     else 
  59.                     { 
  60.                         content.AppendFormat("\t\tpublic {0} {1};\r\n", model.Value, model.Key); 
  61.                     } 
  62.  
  63.                     content.AppendLine(); 
  64.                 } 
  65.  
  66.                 content.AppendLine("\t}"); 
  67.                 content.AppendLine(); 
  68.             } 
  69.  
  70.             return content.ToString(); 
  71.         } 
  72.  
  73.         ///  
  74.         /// 获取类型的字符串表示 
  75.         ///  
  76.         ///  
  77.         ///  
  78.         private string GetTypeString(Type type) 
  79.         { 
  80.             if (type == typeof(int)) 
  81.             { 
  82.                 return "int"; 
  83.             } 
  84.             else if (type == typeof(bool)) 
  85.             { 
  86.                 return "bool"; 
  87.             } 
  88.             else if (type == typeof(Int64)) 
  89.             { 
  90.                 return "long"; 
  91.             } 
  92.             else if (type == typeof(string)) 
  93.             { 
  94.                 return "string"; 
  95.             } 
  96.             else if (type == typeof(List)) 
  97.             { 
  98.                 return "List"; 
  99.             } 
  100.             else if (type == typeof(List)) 
  101.             { 
  102.                 return "List"; 
  103.             } 
  104.             else 
  105.             { 
  106.                 return "string"; 
  107.             } 
  108.         } 
  109.  
  110.         ///  
  111.         /// 获取字典类型 
  112.         ///  
  113.         ///  
  114.         private string GetDicType(JSObject jsObj, ref int index) 
  115.         { 
  116.             AutoClass classInfo = new AutoClass(); 
  117.  
  118.             var model = ((Microsoft.JScript.JSObject)(jsObj)).GetMembers(System.Reflection.BindingFlags.GetField); 
  119.             foreach (Microsoft.JScript.JSField item in model) 
  120.             { 
  121.                 string name = item.Name; 
  122.                 Type type = item.GetValue(item).GetType(); 
  123.                 if (type == typeof(ArrayObject)) 
  124.                 { 
  125.                     // 集合 
  126.                     string typeName = GetDicListType((ArrayObject)item.GetValue(item), ref index); 
  127.                     if (!string.IsNullOrEmpty(typeName)) 
  128.                     { 
  129.                         classInfo.Dic.Add(name, typeName); 
  130.                     } 
  131.                 } 
  132.                 else if (type == typeof(JSObject)) 
  133.                 { 
  134.                     // 单个对象 
  135.                     string typeName = GetDicType((JSObject)item.GetValue(item), ref index); 
  136.                     if (!string.IsNullOrEmpty(typeName)) 
  137.                     { 
  138.                         classInfo.Dic.Add(name, typeName); 
  139.                     } 
  140.                 } 
  141.                 else 
  142.                 { 
  143.                     classInfo.Dic.Add(name, GetTypeString(type)); 
  144.                 } 
  145.             } 
  146.  
  147.             index++; 
  148.             classInfo.CLassName = "Class" + index; 
  149.             dataList.Add(classInfo); 
  150.             return classInfo.CLassName; 
  151.         } 
  152.  
  153.         ///  
  154.         /// 读取集合类型 
  155.         ///  
  156.         ///  
  157.         ///  
  158.         ///  
  159.         private string GetDicListType(ArrayObject jsArray, ref int index) 
  160.         { 
  161.             string name = string.Empty; 
  162.             if ((int)jsArray.length > 0) 
  163.             { 
  164.                 var item = jsArray[0]; 
  165.                 var type = item.GetType(); 
  166.                 if (type == typeof(JSObject)) 
  167.                 { 
  168.                     name = "List<" + GetDicType((JSObject)item, ref index) + ">"; 
  169.                 } 
  170.                 else 
  171.                 { 
  172.                     name = "List<" + GetTypeString(type) + ">"; 
  173.                 } 
  174.             } 
  175.  
  176.             return name; 
  177.         } 
  178.     } 
  179.  
  180.     public class AutoClass 
  181.     { 
  182.         public string CLassName { get; set; } 
  183.  
  184.         private Dictionary dic = new Dictionary(); 
  185.  
  186.         public Dictionary Dic 
  187.         { 
  188.             get 
  189.             { 
  190.                 return this.dic; 
  191.             } 
  192.             set 
  193.             { 
  194.                 this.dic = value; 
  195.             } 
  196.         } 
  197.     } 
  198. } 

 调用方式:

  
 
  1. JsonHelper helper = new JsonHelper(true); 
  2. try 
  3. { 
  4.    this.txtOutPut.Text = helper.GetClassString("json字符串"); 
  5. } 
  6. catch 
  7. { 
  8.    this.txtOutPut.Text = "输入内容不符合规范..."; 
  9. }

 ***如果dudu允许的话,我再附上一个测试地址吧:http://www.51debug.com/tool/JsonToCharpCode.aspx

 博客也写了几次了,不过每次都写得比较滥,看着不舒服,这次用心写了一下,欢迎大家拍砖或提供更好的建议。


网页标题:也谈C#之Json,从Json字符串到类代码
本文链接:http://hnjierui.cn/article/djogojd.html

其他资讯