我自己创建一个一个 JsonHelper 类,只是供大家参考

本文介绍了一种简化.NET应用程序中从数据库表直接生成JSON的方法,避免了将数据转换为对象后再转JSON的过程,提高了效率。


                     我的后台开发语言是 .net  ,界面使用 Ext  做的,在做项目的时候,发现一个问题,每开发一个功能,查询数据库,把数据库的表结构返回给类库作为一个对象处理

,然后返回给界面需要重新转换一成 Json 字符串,我开始的时候使用:

     List<Hr_CompanyInfo> list = new List<Hr_CompanyInfo>();
            foreach (DataRow row in Hr_CompanyManager.GetAllCompany(strConndition).Rows)
            {
                Hr_CompanyInfo info = new Hr_CompanyInfo();
                info.Name = row["Name"].ToString();
                info.Id = new Guid(row["Id"].ToString());
                info.Leaf = Convert.ToBoolean(row["Leaf"].ToString());
                list.Add(info);
            }
            JavaScriptSerializer s = new JavaScriptSerializer();
            StringBuilder temp_sb = new StringBuilder();
            s.Serialize(list, temp_sb);          
            tree_json = temp_sb.ToString();

         上面的显示是给 树结构使用的,

如果是给 Gridview 使用,数据返回格式是:

List<Hr_CompanyInfo> list = new List<Hr_CompanyInfo>();
            foreach (DataRow row in   Hr_CompanyManager.GetCompanyPage(strConndition).Rows)
            {
                list.Add(Hr_CompanyManager.DataReaderToEntity(row));


            }
            JavaScriptSerializer s = new JavaScriptSerializer();
            StringBuilder temp_sb = new StringBuilder();
            s.Serialize(list, temp_sb);


            Int64 totalCount = Hr_CompanyManager.GetComanyCount("");
            
            StringBuilder b = new StringBuilder();
            b.Append("totalCount:" + totalCount.ToString() + ",");
            b.Append("success:true,");
            b.Append("error:\"\"");
            b.Append(",singleInfo:\"\"");
            
            
            tree_json = "{"+ b.ToString() +" , temp_json:" + temp_sb.ToString() + "}"; 


       这两种方式多不错,但是我自己觉得,这样每次都是做重复工作,而且把数据库表首先转换成对象,然后把对象转换成Json ,,为什么不直接把表抓出,直接转化成json 呢

所以我 学了一个类, 注意是把数据的表数据直接读出,是 datatable 类型,然后创建json 

 贴代码了:

namespace Rinpak.HR.Business
{
    public class JSONHelper
    {
        /*
           action:
         * 0 操作失败
         * 1,操作成功
         * 2,没有提供参数
         * 3,存在子类,请先删除子类
         
         */


        private String m_result;
        private readonly String END = "@End@";
        private readonly String DATA = "data:";
        private ArrayList list = new ArrayList();


        private readonly String m_NOParams = "{ 'success':'false', 'msg':'请提供参数!', 'action':'2' }";
        private readonly String m_HASChild = "{ 'success':false, 'msg':'存在子类,请先删除子类!', 'action':'3' }";
        private readonly String m_Success = "{ 'success':true, 'msg':'恭喜你,操作成功!', 'action':'1' }";
        private readonly String m_False = "{ 'success':false, 'msg':'对不起,操作失败!', 'action':'0' }";




        public String ResultMsg {


            get {
                return m_result;
            }
        }


        public String HASChild
        {
            get { return m_HASChild; }
        }


        public String NoParams
        {
            get { return m_NOParams; }
        }
        public String ProSuccess
        {
            get { return m_Success; }
        }
        public String ProFalse
        {
            get { return m_False; }
        }


        public JSONHelper()
        { 
           
        }

     // 这个方法是关键
        public String TransferJSON(DataTable dt, Boolean isPage)
        {
            if(dt.Rows.Count <=0)
                return  "{ " + DATA + "[{}]" +"}";
            Int32 count = dt.Rows.Count;
            Int32 t = 0;
            for (Int32 r = 0; r < count; r++ )  // 这个我是查询有多少行
            {
                list.Add("{");


                for (int i = 0; i < dt.Columns.Count; i++)  // 这里判断一共有多少列
                {
                    list.Add(SetHash(dt.Columns[i].ColumnName, Convert.ToString(dt.Rows[r][i])));
                }


                if (r == count - 1)
                    list.Add("}");
                else
                    list.Add("},");
                t++;
            }


            StringBuilder a = new StringBuilder();
            foreach (string str in list)
            {
                a.Append(str);
            }


            if (isPage)
            {
                StringBuilder b = new StringBuilder();
                
                b.Append("{ totalCount:" + count.ToString() + ",");
                b.Append("success:true,");
                b.Append(DATA + "[" + a.ToString() + "]}");
                return b.ToString();
            }
            else
                return "{" +  DATA + "[" + a.ToString() + "]}";
            
        }


       
        private String SetHash(String name, String value)
        {
            if(list.Count <=1)
                return "'" + name +"':" + "'" + value +"'" ;  
            else
                return " ,'" + name + "':" + "'" + value + "'";  
        }


    }
}


 界面调用: DataTable dt = Hr_CompanyManager.SelectByCondition(strConndition);
            JSONHelper json = new JSONHelper();
            tree_json= json.TransferJSON(dt, false);

是不是简单多了,哈哈,希望大家提建议,一起进步

### 创建配置加载器 在 C# 中,创建一个通用的配置加载器可以提高代码复用性和维护性。以下是一个适用于 .NET Core 或 .NET 6 的示例,它使用 `Microsoft.Extensions.Configuration` 来读取 `appsettings.json` 文件中的配置信息: ```csharp using Microsoft.Extensions.Configuration; using System.IO; public class ConfigProvider { public static IConfigurationRoot GetConfiguration() { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); return builder.Build(); } } ``` 通过调用 `GetConfiguration()` 方法,可以获取整个配置树,并根据键路径访问具体值。例如: ```csharp var config = ConfigProvider.GetConfiguration(); string connectionString = config["Database:ConnectionString"]; ``` 此方法不仅支持从 JSON 文件中读取数据,还可以结合环境变量、命令行参数等其他配置源[^1]。 ### 使用 App.Config 配置文件 对于基于 .NET Framework 的项目,通常使用 `App.config` 文件来存储应用程序配置信息。该文件格式为 XML,包含 `<appSettings>` 节点用于定义键值对。例如: ```xml <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> <appSettings> <add key="userName" value="1" /> <add key="password" value="2" /> <add key="Department" value="3" /> <add key="returnValue" value="4" /> <add key="pwdPattern" value="5" /> <add key="userPattern" value="6" /> </appSettings> </configuration> ``` 在库中访问这些配置值时,需要通过反射获取宿主程序的 `.exe.config` 文件路径,并使用 `ConfigurationManager.OpenExeConfiguration` 方法打开配置文件: ```csharp using System.Configuration; using System.Reflection; public class AppSettingsReader { public static string GetSetting(string key) { var config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location); var section = (AppSettingsSection)config.GetSection("appSettings"); return section.Settings[key]?.Value; } } ``` 此方法允许在不直接依赖主程序的情况下读取配置信息[^2]。 ### 加载 JSON 文件作为配置源 除了标准的 `appsettings.json` 和 `App.config` 文件外,还可以创建自定义的 JSON 文件来管理特定模块或功能的配置。以下是一个帮助,用于加载外部 JSON 文件并解析其内容: ```csharp using System; using System.IO; using Newtonsoft.Json; public class JsonHelper { protected string TextJson { get; set; } private string File { get; set; } protected JsonHelper() { } // 传入文件路径 protected JsonHelper(string file) { if (!File.Exists(file)) { throw new FileNotFoundException(file); } File = file; TextJson = File.ReadAllText(file); } /// <summary> /// 加载json文件 /// </summary> /// <param name="filePath">文件绝对路径</param> /// <returns>返回jsonHelper实例</returns> public static JsonHelper LoadJsonFile(string filePath) { return new JsonHelper(filePath); } public JsonAppSetting AppSetting => new JsonAppSetting(File); } public class JsonAppSetting { private readonly string _filePath; public JsonAppSetting(string filePath) { _filePath = filePath; } public T GetValue<T>() { string json = File.ReadAllText(_filePath); return JsonConvert.DeserializeObject<T>(json); } } ``` 此可用于读取任意 JSON 格式的配置文件,并将其反序列化为强型对象[^5]。 ### 相关问题 1. 如何在 Unity 项目中引用库并正确读取 AppSettings? 2..NET Core 库中如何实现似 App.Config 的 XML 配置功能? 3. 使用 appsettings.json 时如何处理不同环境下的配置差异? 这些问题涉及跨平台配置管理、XML 文件解析以及多环境配置策略,均可以通过扩展上述配置加载器来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值