json转类对象
自从.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库。
#p#
从json字符串自动生成C#类
1、试着百度了一下,也尝试了几个可以使用的类。于是找到了
如下的代码,能够解析一个json字符串,成为一个C#的对象。
这里引用了,Microsoft.JScript.dll 类库。
- Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
- var m = Microsoft.JScript.Eval.JScriptEvaluate("(" + jsonStr + ")", ve);
2、发现这个m对象,其实是一个JSObject对象,内部也可以继续进行细分,于是测试了种种,稍后会上源码。先看测试效果吧。
我们随便在web上面找了一个json字符串来进行处理。当然json要稍稍复杂一点。
ps:代码如下
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Microsoft.JScript;
- namespace Common
- {
- /// <summary>
- /// Json字符串zhuanh
- /// </summary>
- public class JsonHelper : IHelper
- {
- /// <summary>
- /// 是否添加get set
- /// </summary>
- private bool isAddGetSet = false;
- /// <summary>
- /// 数据集合,临时
- /// </summary>
- private List<AutoClass> dataList = new List<AutoClass>();
- public JsonHelper()
- {
- }
- public JsonHelper(bool isAddGetSet)
- {
- this.isAddGetSet = isAddGetSet;
- }
- /// <summary>
- /// 获取类的字符串形式
- /// </summary>
- /// <param name="jsonStr"></param>
- /// <returns></returns>
- public string GetClassString(string jsonStr)
- {
- Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
- var m = Microsoft.JScript.Eval.JScriptEvaluate("(" + jsonStr + ")", ve);
- int index = 0;
- var result = GetDicType((JSObject)m, ref index);
- StringBuilder content = new StringBuilder();
- foreach (var item in dataList)
- {
- content.AppendFormat("\tpublic class {0}\r\n", item.CLassName);
- content.AppendLine("\t{");
- foreach (var model in item.Dic)
- {
- if (isAddGetSet)
- {
- content.AppendFormat("\t\tpublic {0} {1}", model.Value, model.Key);
- content.Append(" { get; set; }\r\n");
- }
- else
- {
- content.AppendFormat("\t\tpublic {0} {1};\r\n", model.Value, model.Key);
- }
- content.AppendLine();
- }
- content.AppendLine("\t}");
- content.AppendLine();
- }
- return content.ToString();
- }
- /// <summary>
- /// 获取类型的字符串表示
- /// </summary>
- /// <param name="type"></param>
- /// <returns></returns>
- private string GetTypeString(Type type)
- {
- if (type == typeof(int))
- {
- return "int";
- }
- else if (type == typeof(bool))
- {
- return "bool";
- }
- else if (type == typeof(Int64))
- {
- return "long";
- }
- else if (type == typeof(string))
- {
- return "string";
- }
- else if (type == typeof(List<string>))
- {
- return "List<string>";
- }
- else if (type == typeof(List<int>))
- {
- return "List<int>";
- }
- else
- {
- return "string";
- }
- }
- /// <summary>
- /// 获取字典类型
- /// </summary>
- /// <returns></returns>
- private string GetDicType(JSObject jsObj, ref int index)
- {
- AutoClass classInfo = new AutoClass();
- var model = ((Microsoft.JScript.JSObject)(jsObj)).GetMembers(System.Reflection.BindingFlags.GetField);
- foreach (Microsoft.JScript.JSField item in model)
- {
- string name = item.Name;
- Type type = item.GetValue(item).GetType();
- if (type == typeof(ArrayObject))
- {
- // 集合
- string typeName = GetDicListType((ArrayObject)item.GetValue(item), ref index);
- if (!string.IsNullOrEmpty(typeName))
- {
- classInfo.Dic.Add(name, typeName);
- }
- }
- else if (type == typeof(JSObject))
- {
- // 单个对象
- string typeName = GetDicType((JSObject)item.GetValue(item), ref index);
- if (!string.IsNullOrEmpty(typeName))
- {
- classInfo.Dic.Add(name, typeName);
- }
- }
- else
- {
- classInfo.Dic.Add(name, GetTypeString(type));
- }
- }
- index++;
- classInfo.CLassName = "Class" + index;
- dataList.Add(classInfo);
- return classInfo.CLassName;
- }
- /// <summary>
- /// 读取集合类型
- /// </summary>
- /// <param name="jsArray"></param>
- /// <param name="index"></param>
- /// <returns></returns>
- private string GetDicListType(ArrayObject jsArray, ref int index)
- {
- string name = string.Empty;
- if ((int)jsArray.length > 0)
- {
- var item = jsArray[0];
- var type = item.GetType();
- if (type == typeof(JSObject))
- {
- name = "List<" + GetDicType((JSObject)item, ref index) + ">";
- }
- else
- {
- name = "List<" + GetTypeString(type) + ">";
- }
- }
- return name;
- }
- }
- public class AutoClass
- {
- public string CLassName { get; set; }
- private Dictionary<string, string> dic = new Dictionary<string, string>();
- public Dictionary<string, string> Dic
- {
- get
- {
- return this.dic;
- }
- set
- {
- this.dic = value;
- }
- }
- }
- }
调用方式:
- JsonHelper helper = new JsonHelper(true);
- try
- {
- this.txtOutPut.Text = helper.GetClassString("json字符串");
- }
- catch
- {
- this.txtOutPut.Text = "输入内容不符合规范...";
- }
***如果dudu允许的话,我再附上一个测试地址吧:http://www.51debug.com/tool/JsonToCharpCode.aspx
博客也写了几次了,不过每次都写得比较滥,看着不舒服,这次用心写了一下,欢迎大家拍砖或提供更好的建议。