在项目开发过程中,经常需要和不同部门或者不同的组员一起协同工作,但对方写的json返回的结果集,我们需要用,那么如何来生成对应的类代码和实体对象呢?于是参考了网上的做法,做一个简单的字符串转实体类的功能,仅仅实现基本的,如果你有其他需求可自行修改代码,如下代码:
<html> <head> <title>JSON字符串转C#实体类</title> <script> </script> </head> <body> <div class="panel panel-default"> <div class="panel-heading"> <div class="media"> <div class="media-body"> <h4 class="media-heading">JSON字符串转C#实体类</h4> </div> </div> </div> <div class="panel-body"> <!--内容块开始--> <p style="margin-top: 20px;"> 命名空间:<input type="text" id=txtNameSpace /><br /> <textarea id="json" class="form-control" style="height: 200px; width:800px;"></textarea></p> <p> <button type="submit" data-toggle="modal" data-target="#myModal" class="btn btn-primary btn-sm" onclick="genJson();">生成实体类</button> <button type="submit" class="btn btn-primary btn-sm" onclick="return testCase();">来个json试试</button> <button type="button" class="btn btn-danger btn-sm" onclick="$('#json').val('')">清空</button> <br /> <button type="button" class="btn btn-danger btn-sm" onclick="genJsonTest('#json')">test</button> </p> <p style="margin-top: 20px;"><textarea id="resData" class="form-control" style="height: 300px; width:800px;"></textarea></p> <!-- Modal --> <!--内容块结束--> </div> <div class="panel-footer"></div> </div> </body> </html> <script src="jquery-1.10.2.js"></script> <script src="jsontocsharp.js"></script> <script> function genJsonTest(obj) { alert($(obj).val()); } function genJson() { $("#resData").html(''); if ($("#json").val().trim() == "") { $("#resData").text("请填写JSON"); return false; } try { var v = eval("(" + document.getElementById("json").value + ")"); } catch(e) { $("#resData").html('Json字符串转换失败!\r\n请检查字符串是否为标准json格式。'); return false; } JSON2CSharp.NamespaceConfig = { IsGenNamespace: true, Namespace: document.getElementById("txtNameSpace").value }; //JSON2CSharp.NamespaceConfig.IsGenNamespace = false; var res = JSON2CSharp.convert(v); //$("#resData").html("<pre>" + res + "</pre>"); $("#resData").html(res); }; function testCase() { $("#json").val('{\r\n\t"animals":{\r\n\t"dog":[\r\n\t\t{"name":"Rufus","breed":"labrador","count":1,"twoFeet":false},\r\n\t\t{"name":"Marty","breed":"whippet","count":1,"twoFeet":false}\r\n\t],\r\n\t"cat":{"name":"Matilda"}\r\n}\r\n}'); } </script>
代码很简单,我想你一定会,注意里面引用了jQuery文件;另外jsontocsharp.js文件如下,在生成的代码时也可以生成命名空间的代码,并且可配置的哦!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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: [], NamespaceConfig: { IsGenNamespace: true, Namespace: "JsonNamespace.TestWeb" }, _genClassCode: function (obj, name) { var clas = this._genComment(name || "RootObj", obj).replace(/\t/g, ""); clas += "public class {0}\r\n{\r\n".format(name || "RootObj"); for (var n in obj) { var v = obj[n]; n = n.trim(); if (n.length > 0) clas += "{0}\tpublic {1} {2} { get; set; }\r\n\r\n".format(this._genComment(n, v), this._genTypeByProp(n, v), n); } clas += "}\r\n"; this._allClass.push(clas); return this._allClass.join("\r\n"); }, _genTypeByProp: function (name, val) { switch (Object.prototype.toString.apply(val)) { case "[object Number]": { return val.toString().indexOf(".") > -1 ? "double" : "int"; } case "[object Boolean]": { return "bool"; } 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 (obj, val) { //return ""; var commm = typeof (val) == "string" && /.*[\u4e00-\u9fa5]+.*$/.test(val) ? val : obj; commm += Object.prototype.toString.apply(val) == "[object Array]" ? "List" : ""; return "\t/// <summary>\r\n\t/// " + commm + "\r\n\t/// </summary>\r\n"; }, _genNamespase: function (objClass) { var tmpClass = ""; if (this.NamespaceConfig.IsGenNamespace) tmpClass = this._genComment("本命名空间下的代码使用Jack自动生成的代码\r\n/// 如果你修改了本次生成的代码,则后续将有可能会被覆盖或重置").replace(/\t/g, "") + "namespace " + this.NamespaceConfig.Namespace + "\r\n{\r\n" + objClass + "}\r\n"; else tmpClass = objClass; return tmpClass; }, convert: function (jsonObj) { this._allClass = []; return this._genNamespase(this._genClassCode(jsonObj)); } }
生成完了代码,那么怎么用呢?只要把json返回的结果集字符串,转换成生成的对象类就可以了,大概如下:
JsonNamespace.TestWeb.Root rootObj = PVG.Lib.Json.JsonHelper.JsonStringToObject<JsonNamespace.TestWeb.Root>(jsonStr);
剩下的就看你怎么使用rootObj对象了,你需要的属性和数据都在里面。
参考出处:http://www.bejson.com/convert/json2csharp/