[
{"cgsl_text":289,"dw":"1","cgid":129,"gg":"啊啊啊","pm":"A1","sccs":"CS1","cgsl":160,"cglszh":3,"dj":23.4568,"je":1876.544,"fhsl":80,"ph":"76887","scrq":"2017-03-13T00:00:00","xq":"2020-06-19T00:00:00","_id":26,"_uid":26,"_state":"added"},
{"cgsl_text":289,"dw":"1","cgid":129,"gg":"OOOO","pm":"A2","sccs":"CS2","cgsl":160,"cglszh":3,"dj":23.4568,"je":2111.112,"fhsl":90,"ph":"5rew3","scrq":"2016-06-20T00:00:00","xq":"2020-06-19T00:00:00","_id":27,"_uid":27,"_state":"added"},
{"cgsl_text":289,"dw":"1","cgid":129,"gg":"AAAA","pm":"A3","sccs":"CS3","cgsl":160,"cglszh":3,"dj":23.4568,"_id":23,"_uid":23,"je":23.4568,"_state":"modified","fhsl":1,"ph":"43t5","scrq":"2016-06-20T00:00:00","xq":"2020-06-19T00:00:00"},
{"cgsl_text":332,"dw":"1","cgid":132,"gg":"BBB","pm":"A4","sccs":"CS4","cgsl":200,"cglszh":3,"dj":234,"_id":24,"_uid":24,"scrq":"2016-06-20T00:00:00","_state":"modified","xq":"2019-06-15T00:00:00","ph":"87yuj","je":23400,"fhsl":100},
{"cgsl_text":248,"dw":"1","cgid":158,"gg":"BVBB","pm":"A5","sccs":"CS5","cgsl":90,"cglszh":3,"dj":1.345456,"xq":"2019-06-15T00:00:00","je":80.72736,"fhsl":60,"scrq":"2016-06-20T00:00:00","ph":"67yft","_id":28,"_uid":28,"_state":"added"},
{"cgsl_text":248,"dw":"1","cgid":158,"gg":"DFFF","pm":"A6","sccs":"CS6","cgsl":90,"cglszh":3,"dj":1.3455,"_id":25,"_uid":25,"xq":"2019-06-15T00:00:00","_state":"modified","je":26.909999999999997,"fhsl":20,"scrq":"2016-06-20T00:00:00","ph":"45tffc"}]
因为前台填写顺序不同,造成取到的JSON字段顺序混乱,但后台需要把JSON转成DATATABLE直接传入SQLSERVER里面执行,试过网上的JSON转datatable的方法,往datatable里写入值会顺序混乱,因此想问下有没有解决办法。 #region Json 字符串 转换为 DataTable数据集合
        /// <summary>
        /// Json 字符串 转换为 DataTable数据集合
        /// </summary>
        /// <param name="json"></param>
        /// <returns></returns>
        /// <summary>
        /// 将json转换为DataTable
        /// </summary>
        /// <param name="strJson">得到的json</param>
        /// <returns></returns>
        public static DataTable Json2DataTable(string strJson)
        {
            //转换json格式
            strJson = strJson.Replace(",\"", "*\"").Replace("\":", "\"#").ToString();
            //取出表名   
            var rg = new Regex(@"(?<={)[^:]+(?=:\[)", RegexOptions.IgnoreCase);
            string strName = rg.Match(strJson).Value;
            DataTable tb = null;
            //去除表名   
            strJson = strJson.Substring(strJson.IndexOf("[") + 1);
            strJson = strJson.Substring(0, strJson.IndexOf("]"));            //获取数据   
            rg = new Regex(@"(?<={)[^}]+(?=})");
            MatchCollection mc = rg.Matches(strJson);
            for (int i = 0; i < mc.Count; i++)
            {
                string strRow = mc[i].Value;
                string[] strRows = strRow.Split('*');                //创建表   
                if (tb == null)
                {
                    tb = new DataTable();
                    tb.TableName = strName;
                    foreach (string str in strRows)
                    {
                        var dc = new DataColumn();
                        string[] strCell = str.Split('#');                        if (strCell[0].Substring(0, 1) == "\"")
                        {
                            int a = strCell[0].Length;
                            dc.ColumnName = strCell[0].Substring(1, a - 2);
                        }
                        else
                        {
                            dc.ColumnName = strCell[0];
                        }
                        tb.Columns.Add(dc);
                    }
                    tb.AcceptChanges();
                }                //增加内容   
                DataRow dr = tb.NewRow();
                for (int r = 0; r < strRows.Length; r++)
                {
                    dr[r] = strRows[r].Split('#')[1].Trim().Replace(",", ",").Replace(":", ":").Replace("\"", "");
                }
                tb.Rows.Add(dr);
                tb.AcceptChanges();
            }            return tb;
        }
        #endregion
谢谢各位大神,没分了,只有50分了

解决方案 »

  1.   

    DATATABLE直接传入SQLSERVER里
    与字段排列顺序无关,SQLSERVER 总是对号入座的
      

  2.   

    是的,datatable的列名没有问题,只是因为在JSON转成Datatable的时候,由于JSON里面的字段顺序不一致,所以造成本来是A字段的值,被填到了B字段,所以传入SQL之后,取到的这个字段的内容,就是错的
      

  3.   

    你可以选择用反序列化进行json转化,如果一定要转datatable,再转
      

  4.   

    Datatable 的每一列都有名字,一样可以对号入座
    如果你非要图巧用数组赋值,那自然是后果自负了
      

  5.   

    你这标准的json直接就可以发序列化成dt了啊...
      

  6.   

    https://dotblogs.com.tw/shadow/archive/2011/11/30/60083.aspx
    我在网上找了个Json.NET转datatable的方法
      

  7.   

    设 d14.txt 中存放有你的 json 数据,则            var s = File.ReadAllText("d14.txt", Encoding.Default);
                var dt = JsonConvert.DeserializeObject<DataTable>(s);
      

  8.   

    要正确地解析任何东西,都应该使用正规的解析类库,例如 json 就应该是使用正规的 json 解析类库,html 就应该使用正规的 html 解析类库,xml 就应该使用正规的 xml 解析类库。你把所谓的 strJson 变量值当一堆字符来随便匹配单词儿,自然是在胡乱地处理。
      

  9.   

    我记得json转  datatable,靠newtonsoft就可以了(这就是json.net)
    至于顺序,不用下标,用列名来表示。
      

  10.   

    Json转实体我高过,你这个应该是转成List<Model>。
    然后实体转DataTable,分两步走。
    这两步,在百度上应该都可以找到代码,详细的原理介绍。
    直接Json转DataTable的,还没有试过。