开发者社区> 行者武松> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看

json转类对象

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

调用方式:


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

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

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


作者:Supper_litt

来源:51CTO 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【.NET开发福音】使用Visual Studio将JSON格式数据自动转化为对应的类
【.NET开发福音】使用Visual Studio将JSON格式数据自动转化为对应的类
0 0
学习javaScript必知必会(6)~类、类的定义、prototype 原型、json对象
学习javaScript必知必会(6)~类、类的定义、prototype 原型、json对象
0 0
【Groovy】json 字符串反序列化 ( 使用 JsonSlurper 进行 json 字符串反序列化 | 根据 map 集合构造相关类 )
【Groovy】json 字符串反序列化 ( 使用 JsonSlurper 进行 json 字符串反序列化 | 根据 map 集合构造相关类 )
0 0
【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )(二)
【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )(二)
0 0
【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )(一)
【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )(一)
0 0
贡献一个极简的Post请求发送JSON请求的工作类(亲测有效。其余网上其他都是好多不能用)
一、今天发现了需要用到一个Post,来发送JSON请求的工具类,找了蛮多网上的东西,想找一个简介好用的,一直找不到。那么就自己写一个咯。
967 0
JS遍历类、json对象属性、值,方便统一赋值
JS遍历类、json对象属性、值, 我们在页面,经常会接收后面或json返回的数据,要一个一个赋值,遍历json属性,可以方便给界面的控件赋值。
880 0
也谈C#之Json,从Json字符串到类代码
原文:也谈C#之Json,从Json字符串到类代码  阅读目录   json转类对象 逆思考 从json字符串自动生成C#类     json转类对象   自从.net 4.0开始,微软提供了一整套的针对json进行处理的方案。
773 0
C#的百度地图开发(二)转换JSON数据为相应的类
原文:C#的百度地图开发(二)转换JSON数据为相应的类 在《C#的百度地图开发(一)发起HTTP请求》一文中我们向百度提供的API的URL发起请求,并得到了返回的结果,结果是一串JSON数据,我们先将这个JSON数据,使用在线工盯进行格式化。
1165 0
后端 传输 json 数据(导包错误)
后端 传输 json 数据(导包错误)
0 0
+关注
行者武松
杀人者,打虎武松也。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载