JSON字符串转C#实体Class类

 在项目开发过程中,经常需要和不同部门或者不同的组员一起协同工作,但对方写的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文件如下,在生成的代码时也可以生成命名空间的代码,并且可配置的哦!

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 &#60;{0} &#62;".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/// &#60;summary&#62;\r\n\t/// " + commm + "\r\n\t/// &#60;/summary&#62;\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));
    }
}
View Code

 生成完了代码,那么怎么用呢?只要把json返回的结果集字符串,转换成生成的对象类就可以了,大概如下:

JsonNamespace.TestWeb.Root rootObj = PVG.Lib.Json.JsonHelper.JsonStringToObject<JsonNamespace.TestWeb.Root>(jsonStr);

剩下的就看你怎么使用rootObj对象了,你需要的属性和数据都在里面。

 

参考出处:http://www.bejson.com/convert/json2csharp/

转载于:https://www.cnblogs.com/mq0036/p/10240043.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值