自从.net 4.0开始,微软提供了一整套的针对json进行处理的方案。其中,就有如何把json字符串转化成C#类对象,其实这段代码很多人都清楚,大家也都认识,我就不多说,先贴代码。
1、添加引用System.Web.Extensions
2、测试一下代码
1 static class PRogram 2 { 3 /// <summary> 4 /// 程序的主入口点。 5 /// </summary> 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<TestModel>(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 TestModel20 {21 public string name { get; set; }22 23 public int age { get; set; }24 25 public List<string> likes { get; set; }26 }27 }
输出内容:
逆思考由于代码中,经常会遇到需要处理json字符串(抓包比较频繁)。每次遇到json字符串,大多需要解析,又要进行重复劳动,又需要定义一个C#对象类,有没有一个比较好的办法解决呢,不用每次都去写代码。自动生成多好。。。
于是LZ思前,向后,想到了以前用过的一个微软的类库,应该是微软的一个Com库。
从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 /// <summary> 10 /// Json字符串zhuanh 11 /// </summary> 12 public class JsonHelper : IHelper 13 { 14 /// <summary> 15 /// 是否添加get set 16 /// </summary> 17 private bool isAddGetSet = false; 18 19 /// <summary> 20 /// 数据集合,临时 21 /// </summary> 22 private List<AutoClass> dataList = new List<AutoClass>(); 23 24 public JsonHelper() 25 { 26 } 27 28 public JsonHelper(bool isAddGetSet) 29 { 30 this.isAddGetSet = isAddGetSet; 31 } 32 33 /// <summary> 34 /// 获取类的字符串形式 35 /// </summary> 36 /// <param name="jsonStr"></param> 37 /// <returns></returns> 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 /// <summary> 74 /// 获取类型的字符串表示 75 /// </summary> 76 /// <param name="type"></param> 77 /// <returns></returns> 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<string>)) 97 { 98 return "List<string>"; 99 }100 else if (type == typeof(List<int>))101 {102 return "List<int>";103 }104 else105 {106 return "string";107 }108 }109 110 /// <summary>111 /// 获取字典类型112 /// </summary>113 /// <returns></returns>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 else142 {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 /// <summary>154 /// 读取集合类型155 /// </summary>156 /// <param name="jsArray"></param>157 /// <param name="index"></param>158 /// <returns></returns>159 private string GetDicListType(ArrayObject jsArray, ref int index)160 {161 string name = string.Empty;162 if ((int)jsArray.length > 0)163 {164
新闻热点
疑难解答