如何处理嵌套的json字符串转成datable再进行取值呢?

zhoulongfeng 2020-12-13 03:06:03

/// <summary>
/// Json 字符串 转换为 DataTable数据集合
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public static DataTable DtToJson(string json)
{
////取出表名
//Regex 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("]"));

//获取数据
Regex rg = new Regex(@"(?<={)[^}]+(?=})");
MatchCollection mc = rg.Matches(json);
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 = "";
foreach (string str in strRows)
{
DataColumn dc = new DataColumn();
string[] strCell = str.Split(':');

dc.ColumnName = strCell[0].ToString().Replace("\"", "").Trim();
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("/", "").Replace("\"", "").Trim();
}
tb.Rows.Add(dr);
tb.AcceptChanges();
}

return tb;
}






json字符串格式如下:


目标:通过修改上面的函数将json字符串转化成datatable后,可以取到process_code的值,如何实现呢?


...全文
2629 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
拉文麦克 2020-12-14
  • 打赏
  • 举报
回复
json插件好像就有这个方法
吉普赛的歌 2020-12-14
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using Newtonsoft.Json;
using System.Web;
using System.Reflection;
using System.Collections;
using System.Text.RegularExpressions;

//缺少编译器要求的成员“ystem.Runtime.CompilerServices.ExtensionAttribute..ctor”
namespace System.Runtime.CompilerServices
{
    public class ExtensionAttribute : Attribute { }
}

namespace Util
{
    /// <summary>
    /// Author      : yenange
    /// Date        : 2013-12-11
    /// Description : json 辅助类
    /// </summary>
    public class JsonHelper
    {
        /// <summary>
        /// DataSet 转 JSON . add by ngye, on 2013-02-18.
        /// </summary>
        /// <param name="ds">需要转换的数据源ds</param>
        /// <returns>json字符串</returns>
        public static string DataSetToJson(DataSet ds)
        {
            string json = string.Empty;
            if (ds == null)
                return json;

            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);

            try
            {
                using (JsonWriter jw = new JsonTextWriter(sw))
                {
                    JsonSerializer ser = new JsonSerializer();
                    jw.WriteStartArray();

                    foreach (DataTable dt in ds.Tables)
                    {
                        jw.WriteStartObject();
                        jw.WritePropertyName(dt.TableName);

                        jw.WriteStartArray();
                        foreach (DataRow dr in dt.Rows)
                        {
                            jw.WriteStartObject();
                            foreach (DataColumn dc in dt.Columns)
                            {
                                jw.WritePropertyName(dc.ColumnName);
                                ser.Serialize(jw, dr[dc].ToString());
                            }
                            jw.WriteEndObject();
                        }
                        jw.WriteEndArray();
                        jw.WriteEndObject();
                    }
                    jw.WriteEndArray();

                    sw.Close();
                    jw.Close();
                }
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            return sb.ToString();
        }

        /// <summary>
        /// DataTable 转 JSON
        /// </summary>
        /// <param name="atable_data">数据源DataTable</param>
        /// <returns>返回DataTable转换成功的Json格式</returns>
        /// 
        public static string DataTableToJson(DataTable dt)
        {
            string s_jsonstring = string.Empty;
            //参数检测
            if (dt == null)
                return s_jsonstring;

            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            using (JsonWriter jw = new JsonTextWriter(sw))
            {
                JsonSerializer ser = new JsonSerializer();
                jw.WriteStartArray();
                foreach (DataRow dr in dt.Rows)
                {
                    jw.WriteStartObject();
                    foreach (DataColumn dc in dt.Columns)
                    {
                        jw.WritePropertyName(dc.ColumnName);
                        ser.Serialize(jw, dr[dc].ToString());
                    }
                    jw.WriteEndObject();
                }
                jw.WriteEndArray();
                sw.Close();
                jw.Close();
            }

            return sb.ToString();
        }

        /// <summary>
        /// 把DataRow转换为Json格式
        /// </summary>
        /// <param name="dr">行记录信息</param>
        /// <returns>返回DataRow转换成功的Json格式</returns>
        public static string DataRowToJson(DataRow dr)
        {
            string jsonString = string.Empty;
            //参数检测
            if (dr == null)
                return jsonString;
            StringBuilder sb = new StringBuilder();
            StringWriter sw = new StringWriter(sb);
            DataTable tableData = dr.Table;
            using (JsonWriter jw = new JsonTextWriter(sw))
            {
                JsonSerializer ser = new JsonSerializer();
                jw.WriteStartArray();
                jw.WriteStartObject();
                foreach (DataColumn dc in tableData.Columns)
                {
                    jw.WritePropertyName(dc.ColumnName);
                    ser.Serialize(jw, dr[dc].ToString());
                }
                jw.WriteEndObject();
                jw.WriteEndArray();
                sw.Close();
                jw.Close();
            }
            return sb.ToString();
        }

        /// <summary>
        /// 将 json 输出到客户端
        /// </summary>
        /// <param name="json">Json格式内容</param>
        public static void ResponseWriteJson(String json)
        {
            HttpContext.Current.Response.ContentType = "text/json";
            HttpContext.Current.Response.Write(json);
        }

        #region Json的序列化和反序列化
        /// <summary>
        /// 
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static string ToJson(object obj)
        {
            string strJson = string.Empty;
            try
            {
                strJson = Newtonsoft.Json.JsonConvert.SerializeObject(obj, new DateTimeJsonConverter(), new LongJsonConverter());
            }
            catch (Exception ex)
            {
                //NengLong.CMP.Log.Base.Logging.Logger.Current.Fatal(ex);
            }
            return strJson;

        }

        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static T FromJson<T>(string sJson)
        {
            try
            {
                return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(sJson, new DateTimeJsonConverter(), new LongJsonConverter());

            }
            catch (Exception ex)
            {
                //NengLong.CMP.Log.Base.Logging.Logger.Current.ErrorFormat("sJson={0}", ex, sJson);
                //NengLong.CMP.Log.Base.Logging.Logger.Current.Fatal(ex);
            }

            return default(T);
        }

        #endregion

        private class DateTimeJsonConverter : Newtonsoft.Json.JsonConverter
        {
            public override bool CanConvert(Type objectType)
            {
                return typeof(DateTime).IsAssignableFrom(objectType);
            }

            public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
            {
                DateTime dt = (DateTime)value;
                writer.WriteValue(dt.ToString("yyyy-MM-dd HH:mm:ss"));

            }
            public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
            {
                return DateTime.Parse(reader.Value.ToString());
            }
        }
        private class LongJsonConverter : Newtonsoft.Json.JsonConverter
        {
            public override bool CanConvert(Type objectType)
            {
                return typeof(long).IsAssignableFrom(objectType);
            }

            public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
            {
                writer.WriteValue(value.ToString());

            }
            public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
            {
                long v = 0;
                long.TryParse(reader.Value.ToString(), out v);
                return v;
            }
        }

        private class StringJsonConverter : Newtonsoft.Json.JsonConverter
        {
            public override bool CanConvert(Type objectType)
            {
                return typeof(string).IsAssignableFrom(objectType);
            }

            public override void WriteJson(Newtonsoft.Json.JsonWriter writer, object value, Newtonsoft.Json.JsonSerializer serializer)
            {
                writer.WriteValue(value.ToString());

            }
            public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer)
            {
                return System.Web.HttpUtility.UrlDecode(reader.Value.ToString());
            }
        }
    }
}
圣殿骑士18 2020-12-14
  • 打赏
  • 举报
回复
直接取json对象不香吗?为什么还要转datatable
  • 打赏
  • 举报
回复
论坛主要是学习原理和技能,并非免费做作业或者帮忙工作。
DB类:数据库访问类 属性: ConnString——连接字符串(如:server=.;uid=sa;pwd=;database=ufdata_001_2010) CMDstring——未使用 oleConnString——连接ACCESS数据库的字符串 方法: OpenConn——打开数据库(无参数) oleOpenConn——打开ACCESS数据库 NoreturnCmdPara(Byval Str_cmdpara as string) 传递Sql命令为参数,无返回值 Sub PROnoreturn(ByVal Str_proName As String, Optional ByVal Str_para1 As String = "", Optional ByVal Str_para2 As String = "", Optional ByVal Str_para3 As String = "", Optional ByVal Str_para4 As String = "", Optional ByVal Str_para5 As String = "", Optional ByVal Str_para6 As String = "") 执行存储过程Str_proName,无返回值 函数: Function ReturnDatablePara(ByVal Str_cmdpara As String) as DataTable 传递Sql命令为参数,返回Datatable Function ReturnOneValuePara(ByVal Str_cmdpara As String) As Object 传递Sql命令为参数,返回单一值 Function ReturnDataReaderPara(ByVal Str_cmdpara As String) As SQlClient.SqlDataReader 传递Sql命令为参数,返回DATAREADER Function ReturnXMLPara(ByVal Str_cmdpara As String) As Xml.XmlReader 传递Sql命令为参数,返回XML Function PROReturnDataReader(ByVal Str_proName As String, Optional ByVal Date_Begin As Date = #1/1/1900#, Optional ByVal Date_End As Date = #1/1/1900#, Optional ByVal Str_SubcompanyCid As String = "", Optional ByVal Str_Code As String = "", Optional ByVal Str_CompanyCid As String = "", Optional ByVal Str_ItemCid As String = "") As SqlClient.SqlDataReader 执行存储过程Str_proName,返回DATAREADER Function PROReturnDataTable(ByVal Str_proName As String, Optional ByVal Date_Begin As Date = #1/1/1900#, Optional ByVal Date_End As Date = #1/1/1900#, Optional ByVal Str_SubcompanyCid As String = "", Optional ByVal Str_Code As String = "", Optional ByVal Str_CompanyCid As String = "", Optional ByVal Str_ItemCid As String = "") As DataTable 执行存储过程Str_proName,返回DATATABLE 以ole开头的方法,用于访问ACCESS数据库 Tools类:工具 方法: 数字转中文大写 GetMonthDateMin:取月份最小日期,表示为:2018-01-01 00:00:00 GetMonthDateMax:取月份最大日期,表示为:2018-01-01 23:59:59 GetField:返回字符值内容,如果值为NULL,则返回为“” GetFieldNum:返回数值内容,如果值为NULL,则返回0 GetFieldNumEX:返回数值内容,如果值为NULL,则返回"" GetMacList:取本机的MAC地址列表 GetMaxDate:返回日期的最大时间值 ,如:2018-01-05,则返回为:2018-01-05 23:59:59 GetMinDate:返回日期的最小时间值 GetPaperLists:返回指定打印机的纸张列表 GetPrinterLists:返回指定本机打印机列表 加密字符串:将指定的字串,按参数2和参数3计算后返回结果, 原码必须小于等 于20位,参数2只能是1-6,参数3只能是1-100 解密字符串:与加密字符串对应,返回解密后的结果

62,266

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧