zoukankan      html  css  js  c++  java
  • JSON生成c#类代码小工具

    JSON生成c#类代码小工具

    为什么写这么个玩意

    最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll(json.net),但是悲剧的是这个dll居然是很老的版本,没有Newtonsoft.Json.Linq、没有JObject,也就是说,如果想使用json必须json字符序列化为.net对象才行,这时问题来了,json格式无比的复杂,如果我一个一个对着json去定义class代码,实在是显得有点蠢了,所以百度了一下,还真找到了一个工具http://json2csharp.chahuo.com/,但是这个工具对我来说有一点点不爽,我的json中属性的值,我希望将它生成为.net中属性的注释如:如

    {
       name:"用户名",password:"密码"
    }
    

    生成

    
    public class Root
    {
    
        /// <summary>
        /// 用户名
        /// <summary>
        public string name { get; set; }
    
        /// <summary>
        /// 密码
        ///</summary>
        public string password { get; set; }
    
    }
    
    

    而该工具貌似不可以,于是使用js写了简单的小工具,(测试数据json来自于:http://www.juhe.cn/docs/api/id/39(不是广告,我随便找的))如下:

    代码

    
    <html>
    <head>
    <title>json生成c#类</title>
    <link rel="stylesheet" href="http://js.chahuo.com/prettify/prettify.css">
    <script language="javascript" type="text/javascript" src="http://js.chahuo.com/prettify/prettify.js"></script>
    <script type="text/javascript" src="http://tool.oschina.net/js/jsbeautify.js"></script>
    </head>
    <body>
    	
    	<h1>json生成C#类小工具</h1>
    	<h5>JSON 字符串</h5>
    	<div>
    		<textarea style="600px;height:300px;margin-bottom:5px;" id="jsonStr"></textarea>
    		<br>
    		<button onclick="document.getElementById('jsonStr').value='';document.getElementById('class').innerHTML=''">清除</button>
    		<button onclick="do_js_beautify()">格式化代码</button>
    		<button onclick="startGen()">生成C#类</button>
    	</div>
    
    	<h5>C#类代码&nbsp;<button onclick="selectCode()">选中代码</button></h5>
    	
    	<pre class="prettyprint" id="class" style="border:1px solid #ccc; padding:10px; 800px;"> 
    			
    	</pre>
    	
    	<script>
    	
    		String.prototype.format = function(){
    			var args = arguments;
    			return this.replace(/{(d+)}/g,                
    				function(m,i){
    					return args[i];
    			});
    		}
    		
    		String.prototype.trim=function(){
    			 return this.replace(/(^s*)|(s*$)/g,"");
    		}
    		
    		JSON2CSharp={
    			_allClass:[],
    			_genClassCode:function(obj,name){
    				var clas="public class {0}
    {
    ".format(name || "Root");
    				for(var n in obj){
    					var v = obj[n];
    					n = n.trim();
    					clas += "    {0}    public {1} {2} { get; set; }
    
    ".format(this._genComment(v),this._genTypeByProp(n,v),n);
    				}
    				clas += "}
    
    ";
    				this._allClass.push(clas);
    				return this._allClass.join("
    
    ");
    			},
    			_genTypeByProp:function(name,val){
    				switch(Object.prototype.toString.apply(val)){
    					case "[object Number]" :{
    						return val.toString().indexOf(".") > -1 ? "double" : "int";
    					}
    					case "[object Date]":{
    						return "DateTime";
    					}
    					case "[object Object]":{
                                                    name =  name.substring(0,1).toUpperCase() + name.substring(1);
    						this._genClassCode(val,name);
    						return name;
    					}
    					case "[object Array]":{
    						return "List&#60;{0}&#62;".format(this._genTypeByProp(name+"Item",val[0]));
    					}
    					default:{
    						return "string";
    					}
    				}	
    			},
    			_genComment:function(val){
    				var commm= typeof(val) == "string" && /.*[u4e00-u9fa5]+.*$/.test(val) ? val : "" ;
    				return "/// &#60;summary&#62;
        /// "+commm+ "
        /// &#60;/summary&#62;
    ";
    			},
    			convert:function(jsonObj){
    				this._allClass=[];
    				return this._genClassCode(jsonObj);
    			}
    		}
    		
    		
    		
    		function do_js_beautify() {
    			var js_source =document.getElementById("jsonStr").value.replace(/^s+/, '');
    			if(js_source.length==0)
    				return;
    			tabchar = ' ';
    			var fjs = js_beautify(js_source);
    			document.getElementById("jsonStr").value=fjs;
    		}
    
    		
    		function startGen(){
    			try{
    				var v = eval("("+document.getElementById("jsonStr").value+")");
    				document.getElementById("class").className ="prettyprint";
    				document.getElementById("class").innerHTML=JSON2CSharp.convert(v);
    				prettyPrint();	
    				document.getElementById("jsonStr").focus();
    			}catch(e){
    				alert(e.message);
    			}
    		}
    		
    		function selectCode() {
    			if (document.selection) {
    				var range = document.body.createTextRange();
    				range.moveToElementText(document.getElementById('class'));
    				range.select();
    			} else if (window.getSelection) {
    				var range = document.createRange();
    				range.selectNode(document.getElementById('class'));
    				window.getSelection().addRange(range);
    			}
    		}
    	</script>
    </body>
    </html>
    
    

    原理非常简单,遍历json对象的属性,根据属性值的类型生成对应的类名即可, 这里不做详细介绍了。 代码写的有点丑,希望大家用得着。

  • 相关阅读:
    Linux_进程之间的通信
    Linux_控制作业(管理)
    Linux_进程管理相关命令
    Linux_进程管理的基本概述
    文本编辑_Vim&Vi
    Linux_权限管理理论概述
    Linux_用户和组管理
    Linux_ACL文件访问控制列表
    72. VUE axios 配置信息相关
    71. VUE axios 发送并发请求(多个)
  • 原文地址:https://www.cnblogs.com/tianqiq/p/4309791.html
Copyright © 2011-2022 走看看