自从.net 4.0开始,微软提供了一整套的针对json进行处理的方案。其中,就有如何把json字符串转化成C#类对象,其实这段代码很多人都清楚,大家也都认识,我就不多说,先贴代码。
1、添加引用 System.Web.Extensions
2、测试一下代码
static class Program
{
/// <summary>
/// 程序的主入口点。
/// </summary>
static void Main()
{
string jsonStr = "{\"name\":\"supperlitt\",\"age\":25,\"likes\":[\"C#\",\"asp.net\"]}";
JavaScriptSerializer js = new JavaScriptSerializer();
var model = js.Deserialize<TestModel>(jsonStr);
Console.WriteLine(model.name);
Console.WriteLine(model.age);
Console.WriteLine(string.Join(",", model.likes));
Console.ReadLine();
}
public class TestModel
{
public string name { get; set; }
public int age { get; set; }
public List<string> likes { get; set; }
}
}
输出内容:
逆思考
由于代码中,经常会遇到需要处理json字符串(抓包比较频繁)。每次遇到json字符串,大多需要解析,又要进行重复劳动,又需要定义一个C#对象类,有没有一个比较好的办法解决呢,不用每次都去写代码。自动生成多好。。。
于是LZ思前,向后,想到了以前用过的一个微软的类库,应该是微软的一个Com库。
从json字符串自动生成C#类
1、试着百度了一下,也尝试了几个可以使用的类。于是找到了
如下的代码,能够解析一个json字符串,成为一个C#的对象。
1 Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
2 var m = Microsoft.JScript.Eval.JScriptEvaluate("(" + jsonStr + ")", ve);
这里引用了,Microsoft.JScript.dll 类库。
2、发现这个m对象,其实是一个JSObject对象,内部也可以继续进行细分,于是测试了种种,稍后会上源码。先看测试效果吧。
我们随便在web上面找了一个json字符串来进行处理。当然json要稍稍复杂一点。
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