C# 通用解析JSON保存到数据库

最近做了一个通用可配置管理系统,系统中界面都是数据库中数据来显示的,本系统和别的系统交互时需要用到ResetFul接口那么问题来了:如何写一个程序不改代码的情况下使接口通用?

想了给解决方法:

1、新建一张接口配置表,字段有:接口地址、端口号、接口传输方式等等,根据配置表调用接口;

          过;

2、封装数据库表成传出json;

          在接口定义时确定JSON报文格式,用占位符号的方式把数据库表里的数据拼接JSON(需要考虑每次调用接口拼接数据的条件)代码就不贴了;

3、解析传入json,把数据存到数据库中;

         把JSON解析成多个DataTable,后面保存到数据库的代码就不贴了;

public static class JsonTextConvert
    {
        private static Dictionary<string, DataTable> tbname = new Dictionary<string, DataTable>();

        /// <summary>
        /// 解析json文件
        /// </summary>
        /// <param name='json'></param>
        public async static Task< Dictionary<string, DataTable>> JsConvert(string jsonText)
        {
            if (jsonText.Length < 1)
            {
                return null;
            }
            tbname.Add("root",new DataTable("root"));
            JObject dataView = JsonConvert.DeserializeObject<JObject>(jsonText);
            JEnumerable<JToken> jTokens = dataView.Children();
            List<JEnumerable<JToken>> jTokenss = new List<JEnumerable<JToken>>();
            jTokenss.Add(jTokens);
            await Task.Run(() =>  RecursiveAsync(jTokenss));
            return  tbname;
        }

        /// <summary>
        /// 递归解析json
        /// </summary>
        /// <param name="jTokens"></param>
        /// <returns></returns>
        private  static List< JEnumerable<JToken>> RecursiveAsync(List<JEnumerable<JToken>> jTokens)
        {
                if (jTokens.Count == 0)
                    return null;
                List<JEnumerable<JToken>> sss = new List<JEnumerable<JToken>>();
                foreach (JEnumerable<JToken> jts in jTokens)
                {
                    foreach (JToken jt in jts)
                    {
                        if (jt.Type == JTokenType.Object)
                            sss.Add(jt.Children());
                        else if (jt.Type == JTokenType.Property)
                        {
                            sss.Add(jt.Children());
                            if (jt.First().Type == JTokenType.Array || jt.First().Type == JTokenType.Object)
                                tbname.Add(jt.Path, new DataTable(jt.Path));
                        }
                        else if (jt.Type == JTokenType.Array)
                        {
                            sss.Add(jt.Children());
                            string str = jt.Path.Split(".").Last();
                            if (!tbname.Keys.Contains(jt.Path))
                            {
                                if (str.Contains("["))
                                    tbname.Add(jt.Path, new DataTable(str.Substring(0, str.IndexOf("["))));
                                else
                                    tbname.Add(jt.Path, new DataTable(str));
                            }
                        }
                        else
                        {
                            foreach (string s in tbname.Keys)
                            {
                                string[] ss = jt.Path.Split(".");
                                int endIndex = 0;
                                string trmpString = string.Empty;
                                if (ss.Count() >= 2)
                                {
                                    if (jt.Path.Contains("["))
                                    {
                                        endIndex = ss[ss.Length - 2].ToString().IndexOf("[");
                                        trmpString = ss[ss.Length - 2].ToString().Substring(0, endIndex);
                                    }
                                    else
                                    {
                                        endIndex = 0;
                                        trmpString = ss[ss.Length - 2].ToString();
                                    }
                                }
                                else
                                {
                                    endIndex = 0;
                                    trmpString = "root";
                                }
                                if (trmpString == s.Split(".").Last())
                                {
                                    if (!tbname[s].Columns.Contains(ss.Last()))
                                        tbname[s].Columns.Add(ss.Last());
                                    int RowIndex = Convert.ToInt32(trmpString.Replace(s.Split(".").Last(), "").Replace("[", "").Replace("]", "").Length > 0
                                        ? trmpString.Replace(s.Split(".").Last(), "").Replace("[", "").Replace("]", "") : "0");
                                    if (tbname[s].Rows.Count < RowIndex + 1)
                                        tbname[s].Rows.Add();
                                    tbname[s].Rows[RowIndex][ss.Last()] = jt;
                                }
                            }
                        }
                    }
                }
            return RecursiveAsync(sss);
        }

    }

匆匆忙忙记录一下,欢迎斧正;

使用C# Newtonsoft Json通过json数据,解码json生成用于保存数据类json类,通过json生成类代码,支持子类 自动 如 [{"itemsize":437,"pageId":1,"erpNickShopObj":null,"itemjbxx":[{"num":94628,"numIid":40239293981,"outerId":"异常1元连接","picUrl":"http://img04.taobaocdn.com/bao/uploaded/i4/TB1rdpFGXXXXXc5XFXXXXXXXXXX_!!1-item_pic.gif","price":"1.00","title":"[Enni.kr]<恩妮韩品>补邮费/订单异常关闭专拍连接","volume":0},{"num":65592,"numIid":36048181106,"outerId":"爱茉莉沐浴露套装200ml*3","picUrl":"http://img03.taobaocdn.com/bao/uploaded/i3/516137599/TB21kzXXVXXXXcUXXXXXXXXXXXX_!!516137599.jpg","price":"52.00","title":"韩国进口爱茉莉happybath 沐浴露 柠檬 玫瑰 薰衣草 200ml*3套装","volume":0},{"num":59765,"numIid":38272119734,"outerId":"7难题牙膏 绿款","picUrl":"http://img01.taobaocdn.com/bao/uploaded/i1/516137599/TB2xDbXXVXXXXbbXXXXXXXXXXXX_!!516137599.jpg","price":"9.90","title":"韩国进口LG贝瑞奥/倍瑞奥7难题解决牙膏7功能合一强健120G绿色","volume":0},{"num":59764,"numIid":38288409657,"outerId":"黄金皂2件套礼盒","picUrl":"http://img04.taobaocdn.com/bao/uploaded/i4/516137599/TB2XBbXXVXXXXbKXXXXXXXXXXXX_!!516137599.jpg","price":"90.00","title":"包邮 韩国纯金皂 24K金美容皂 天然特效美容黄金皂 2件套装 礼盒","volume":0},{"num":59763,"numIid":38272395230,"outerId":"7难题牙膏 蓝款","picUrl":"http://img02.taobaocdn.com/bao/uploaded/i2/516137599/TB204vXXVXXXXa5XpXXXXXXXXXX_!!516137599.jpg","price":"9.90","title":"韩国LG 贝瑞奥/倍瑞奥7难题解决牙膏 7功能合一 原味 120G 蓝色","volume":0},{"num":59758,"numIid":38278150798,"outerId":"9928牙膏绿色款","picUrl":"http://img03.taobaocdn.com/bao/uploaded/i3/516137599/TB2KDDXXVXXXXaEXXXXXXXXXXXX_!!516137599.jpg","price":"9.90","title":"韩国 LG贝瑞奥/倍瑞奥9928牙膏 强齿美白牙膏 120G 绿色","volume":0},{"num":59751,"numIid":38288605749,"outerId":"9928牙膏蓝色款","picUrl":"http://img04.taobaocdn.com/bao/uploaded/i4/516137599/TB2n9HXXVXXXXbxXXXXXXXXXXXX_!!516137599.jpg","price":"9.90","title":"韩国 LG 倍瑞奥 9928 牙膏 抗菌 牙龈护理 防蛀牙固定牙齿 120g","volume":0},{"num":59741,"numIid":38301128090,"outerId":"9928牙膏红色款","picUrl":"http://img01.taobaocdn.com/bao/uploaded/i1/516137599/TB2PATXXVXXXXcHXXXXXXXXXXXX_!!516137599.jpg","price":"9.90","title":"韩国 LG贝瑞奥/倍瑞奥9928牙膏 消炎
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值