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="width: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; width: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}\r\n{\r\n".format(name || "Root");
for(var n in obj){
var v = obj[n];
n = n.trim();
clas += " {0} public {1} {2} { get; set; }\r\n\r\n".format(this._genComment(v),this._genTypeByProp(n,v),n);
}
clas += "}\r\n\r\n";
this._allClass.push(clas);
return this._allClass.join("\r\n\r\n");
},
_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<{0}>".format(this._genTypeByProp(name+"Item",val[0]));
}
default:{
return "string";
}
}
},
_genComment:function(val){
var commm= typeof(val) == "string" && /.*[\u4e00-\u9fa5]+.*$/.test(val) ? val : "" ;
return "/// <summary>\r\n /// "+commm+ "\r\n /// </summary>\r\n";
},
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对象的属性,根据属性值的类型生成对应的类名即可, 这里不做详细介绍了。 代码写的有点丑,希望大家用得着。

JSON生成c#类代码小工具的更多相关文章

  1. JSON生成c#类代码小工具(转)

    原文地址: http://www.cnblogs.com/tianqiq/archive/2015/03/02/4309791.html

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

    原文:也谈C#之Json,从Json字符串到类代码  阅读目录 json转类对象 逆思考 从json字符串自动生成C#类  json转类对象 自从.net 4.0开始,微软提供了一整套的针对json进 ...

  3. EA生成实体类代码

    引言 在做机房个人版重构的时候,就听说了EA是一个强大的软件.仅仅只是知道的时候,已经画完了图,没有怎么用EA其它的功能,所以一直没有见识过罢了.如今到了机房合作了,想到EA一定要好好用,这样能省不少 ...

  4. Jsonschema2pojo从JSON生成Java类(命令行)

    1.说明 jsonschema2pojo工具可以从JSON Schema(或示例JSON文件)生成Java类型, 在文章Jsonschema2pojo从JSON生成Java类(Maven) 已经介绍过 ...

  5. JS-在线运行代码小工具

    原理:window.open()方法,open一个新的空白页,然后把文本框中粘贴的代码通过DOM操作,写到新的代码页中, 再利用document.write的功能(写进去之前把其他的全部删掉,并且写进 ...

  6. SQL转Java代码小工具

    工作中使用SQL的时候很多,当使用hibernate的时候,经常遇到多行的SQL,通常在PL/SQL或其他地方写好SQL,测试没问题后,需要将SQL写到程序代码中,多行SQL需要拼接字符串,手动一行行 ...

  7. 三个 DAL 相关的Java代码小工具

    最近在做 DAL (Data Access Layer 数据访问层) 的服务化,发现有不少地方是人工编写比较繁琐的,因此写了几个小工具来完成. 1.  从 DAO 类自动生成 CoreService ...

  8. 一个Json结构对比的Python小工具兼谈编程求解问题

    先上代码. jsondiff.py #!/usr/bin/python #_*_encoding:utf-8_*_ import argparse import json import sys rel ...

  9. Jsonschema2pojo从JSON生成Java类(Maven)

    1.说明 jsonschema2pojo工具可以从JSON Schema(或示例JSON文件)生成Java类型, 并且可以配置生成Jackson 1.x,Jackson 2.x, Moshi 1.x或 ...

随机推荐

  1. gulp外挂 uglify 的使用

    1.js文件压缩 第一步:安装外挂 :  第二步:gulpfile.js 配置 : (首先看你的package.json 中有没有添加依赖,如果有 这一句,代表添加成功啦.) 输入以下代码 : var ...

  2. 笔记本中的archlinux调节亮度

    参考了archlinux的wiki:https://wiki.archlinux.org/index.php/Backlight 说一下情况:/sys/class/backlight/acpi_vid ...

  3. Linux 下 PHP 扩展 cURL 编译安装

    下载 cURL http://pan.baidu.com/s/1hqrHWkG (curl-7.39.0.tar.gz) 3.98MB 解压: tar zxvf curl-7.39.0.tar.gz ...

  4. JavaScript语言精粹读书笔记 - JavaScript函数

    JavaScript是披着C族语言外衣的LISP,除了词法上与C族语言相似以外,其他几乎没有相似之处. JavaScript 函数: 函数包含一组语句,他们是JavaScript的基础模块单元,用于代 ...

  5. Oracle Contact By的使用

    1.概述 Oracle “CONNECT BY”是层次查询子句,一般用于树状或者层次结果集的查询 2.使用方式 2.1.通过Connect by 生成序列 Oracle 构造一个月份的天数 ) s_d ...

  6. ftp常用命令

    ABOR 中断数据连接程序 ACCT <account> 系统特权帐号 ALLO <bytes> 为服务器上的文件存储器分配字节 APPE <filename> 添 ...

  7. git 远程库命令

    git 常用命令在这里就不在说了,初学者点击http://www.cnblogs.com/Vdiao/p/5267250.html Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上 ...

  8. 怎么通过 Mysql 实现数据同步呢?

    怎么使 mysql 数据同步先假设有主机 A 和 B ( linux 系统),主机 A 的 IP 分别是 1.2.3.4 (当然,也可以是动态的),主机 B 的 IP 是 5.6.7.8 .两个主机都 ...

  9. Mybatis框架基于注解的方式,实对数据现增删改查

    编写Mybatis代码,与spring不一样,不需要导入插件,只需导入架包即可: 在lib下 导入mybatis架包:mybatis-3.1.1.jarmysql驱动架包:mysql-connecto ...

  10. Masonry的使用

     1.//添加了这个宏,就不用带mas_前缀了 #define MAS_SHORTHAND //添加了这个宏,equalTo就等于mas_equalTo #define MAS_SHORYHAND_G ...