ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SunnyUI Json 静态类使用指南:零第三方依赖的 C WinForm JSON 序列化方案

SunnyUI Json 静态类使用指南:零第三方依赖的 C WinForm JSON 序列化方案 UI组件桌面应用【免费下载链接】SunnyUISunnyUI.NET 是基于.NET Framework 4.0、.NET6、.NET8、.NET9 框架的 C# WinForm UI、开源控件库、工具类库、扩展类库、多页面开发框架。项目地址https://gitcode.com/gh_mirrors/su/SunnyUI点击查看免费下载本文围绕 docs/Json.md 讲解的简易 Json 静态类展开深入剖析其在 SunnyUI 工具类库中的定位、双后端实现原理与四个核心 API并结合源码 SunnyUI/Common/UJson.cs 给出可复制的实战用法。读完本文你可以在不引入 Newtonsoft.Json 的情况下在 .NET Framework 4.0 与 .NET 8 / .NET 10 的 WinForm 项目中轻松完成对象的 JSON 序列化、反序列化以及配置文件读写。一、功能定位何时该用它何时不该SunnyUI 的Json静态类源码位于 SunnyUI/Common/UJson.cs是一个简易的 JSON 静态工具类其设计初衷是在不引用 Newtonsoft.Json文档中写作 NewtonJson的前提下即可简单处理 JSON 对象的转换。也就是说对于大多数常规场景——例如把配置对象序列化成字符串、把接口返回的 JSON 字符串反序列化成业务对象、读写 JSON 配置文件——直接调用Json.Serialize/Json.Deserialize即可无需为项目额外引入第三方 JSON 库。原文档也明确给出了两条补充建议这里如实保留复杂需求如果涉及复杂的 JSON 处理如自定义契约、多态反序列化、深度定制序列化选项等第三方库Newtonsoft.Json 仍是推荐选择现代框架从 .NET 5 开始官方System.Text.Json的性能已经非常不错如果项目本身运行在 .NET 5 上也可以直接尝试使用System.Text.Json的原生 API。因此SunnyUI.Json的定位可以概括为在 SunnyUI 内部与轻量业务场景中提供开箱即用的 JSON 能力同时为更复杂的需求留出升级到专业 JSON 库的空间。二、实现原理一套 API双后端自动切换Json静态类最大的特点是不需要手动判断运行环境——它通过条件编译指令在编译期自动选择底层序列化实现目标框架底层序列化器命名空间 / 程序集.NET Frameworknet40 / net472JavaScriptSerializerSystem.Web.Script.Serialization位于System.Web.Extensions程序集.NET Core / .NET 5net8 / net10System.Text.Json.JsonSerializerSystem.Text.Json框架内置对应源码见 UJson.cs#if NETFRAMEWORK using System.Web.Script.Serialization; #endif以及 UJson.cs 中的反序列化分支#if NETFRAMEWORK JavaScriptSerializer js new JavaScriptSerializer(); return js.DeserializeT(input); #else return System.Text.Json.JsonSerializer.DeserializeT(input); #endif序列化分支同样如此见 UJson.cs。从项目文件 SunnyUI.csproj 可以看出SunnyUI 库本身同时面向net10.0-windows;net8.0-windows;net472;net40四个目标框架编译其中net40与net472会额外引用System.Web.Extensionscsproj 第 52-62 行这正是JavaScriptSerializer所在的程序集而现代目标框架则直接复用内置的System.Text.Json。这种条件编译 双后端的设计让使用者写一遍代码即可在两个时代的技术栈上获得一致的调用体验。三、核心 API四个静态方法全解析Json类共提供四个公开静态方法全部定义在Sunny.UI命名空间下使用前需using Sunny.UI;。以下逐个说明签名、语义与补充要点。3.1 反序列化DeserializeT// 将指定的 Json 字符串 input 转换为 T 类型的对象 public static T DeserializeT(string input)用途把一段 JSON 文本转换成强类型对象是网络响应解析、配置读取的核心入口。泛型参数T为期望得到的对象类型可为自定义类、ListT、Dictionarystring, object等。异常行为源码确认方法内部用try/catch包裹一旦反序列化失败会在控制台输出异常消息并返回default(T)引用类型为null、值类型为 0而不是向上抛出异常见 UJson.cs。调用方需要注意静默返回默认值意味着失败与成功但内容为空难以直接区分建议在关键业务中对结果做判空校验。3.2 序列化Serialize// 将对象 obj 转换为 Json 字符串 public static string Serialize(object obj)用途把任意可序列化对象转换成 JSON 字符串用于数据输出、日志打印、保存到文件等。补充要点与Deserialize不同Serialize方法本身没有try/catch保护见 UJson.cs若传入不可序列化对象如含循环引用的对象图、含流/句柄字段的对象异常会直接抛出由调用方自行处理。3.3 从文件反序列化DeserializeFromFileT// 从文件读取字符串转换为 T 类型的对象 public static T DeserializeFromFileT(string filename, Encoding encoding)用途直接读取 JSON 配置文件并一步到位转换为对象适合加载设置类场景。实现细节源码确认内部先调用File.ReadAllText(filename, encoding)读取全部文本再交给DeserializeT完成转换见 UJson.cs。因此文件不存在、编码不匹配导致的异常同样被DeserializeT吞掉并返回default(T)。参数说明filename为文件路径encoding指定读取时使用的字符编码例如Encoding.UTF8、Encoding.Default简体中文系统下为 GBK等。3.4 序列化并写入文件SerializeToFile// 将对象 obj 转换为 Json 字符串并保存到文件 public static string SerializeToFile(object obj, string filename, Encoding encoding)用途把对象序列化后直接落盘通常与DeserializeFromFile配对使用实现保存配置 / 加载配置闭环。返回值返回序列化后的 JSON 字符串而不只是void便于调用方在写文件的同时继续使用该字符串见 UJson.cs。实现细节源码确认内部使用StreamWriter(filename, false, encoding)以**覆盖非追加**模式写入并Flush异常时打印控制台消息后仍返回 jsonStr。四、实战示例配置文件的保存与加载下面给出一个完整的、可直接运行的 WinForm / 控制台示例演示四个 API 的协同用法。using System; using System.Text; using Sunny.UI; // Json 静态类所在命名空间 namespace SunnyUIDemo { // 定义一个与 JSON 对应的配置类 public class AppConfig { public string Server { get; set; } public int Port { get; set; } public bool EnableLog { get; set; } } class Program { static void Main() { // 1. 序列化对象 - JSON 字符串 AppConfig cfg new AppConfig { Server 127.0.0.1, Port 8080, EnableLog true }; string json Json.Serialize(cfg); Console.WriteLine(json); // 输出示例{Server:127.0.0.1,Port:8080,EnableLog:true} // 2. 反序列化JSON 字符串 - 对象 AppConfig cfg2 Json.DeserializeAppConfig(json); Console.WriteLine(cfg2.Server); // 127.0.0.1 // 3. 保存配置对象 - JSON 字符串 - 文件UTF-8 编码 Json.SerializeToFile(cfg, appconfig.json, Encoding.UTF8); // 4. 加载配置文件 - 字符串 - 对象 AppConfig cfg3 Json.DeserializeFromFileAppConfig(appconfig.json, Encoding.UTF8); Console.WriteLine(cfg3.Port); // 8080 // 5. 集合场景同样适用 string listJson Json.Serialize(new[] { 1, 2, 3 }); int[] nums Json.Deserializeint[](listJson); Console.WriteLine(nums.Length); // 3 } } }提示在 WinForm 项目中上述调用通常出现在Form_Load加载配置与Form_Closing保存配置等生命周期事件中配合 SunnyUI 的UIForm、UIPage等框架组件使用即可快速为应用搭建持久化配置能力。五、使用注意与边界结合源码归纳以下注意事项均从 UJson.cs 的实际实现归纳得出供实战中规避坑点失败静默化Deserialize/DeserializeFromFile在失败时返回default(T)而非抛异常务必对结果判空尤其当T为引用类型时。默认序列化行为从源码看两个后端调用均未传入任何额外配置参数如JsonSerializerOptions、JavaScriptSerializer的MaxJsonLength等即采用框架默认行为从一般 .NET 行为推断属性名匹配默认区分大小写、默认不包含 null 字段的定制能力有限复杂格式需求请移步 Newtonsoft.Json 或原生System.Text.Json。序列化阶段异常会抛出Serialize无异常保护对象图中若存在循环引用或不可序列化类型会直接抛异常。文件写入为覆盖模式SerializeToFile使用new StreamWriter(filename, false, encoding)重复调用会覆盖旧文件而非追加。适用范围它是 SunnyUI 自带的轻量工具官方文档明确复杂需求仍推荐 Newtonsoft.Json.NET 5 亦可直接用 System.Text.Json不要把它当作功能完备的 JSON 引擎使用。六、延伸阅读仓库内的相关资源官方原始说明文档docs/Json.md核心源码实现SunnyUI/Common/UJson.cs命名空间Sunny.UI静态类Json113 行多目标框架声明与System.Web.Extensions引用SunnyUI.csproj更新日志中对 JSON 工具的记载UJsonConfig扩展说明docs/updates.md同为序列化/配置文件主题的配套工具INI 配置文档 docs/IniFile.md 与 docs/IniConfig.md、JSON 相关配置文件可参考 docs/started.md 了解项目整体接入方式简而言之SunnyUI.Json用不到百行的工具代码为 WinForm 开发者在 .NET Framework 与 .NET 8/10 之间提供了一致、零依赖的 JSON 基础能力——轻量场景直接上手复杂场景平滑切换到专业库这正是它作为 SunnyUI 工具类库一员的价值所在。赞分享UI组件桌面应用【免费下载链接】SunnyUISunnyUI.NET 是基于.NET Framework 4.0、.NET6、.NET8、.NET9 框架的 C# WinForm UI、开源控件库、工具类库、扩展类库、多页面开发框架。项目地址https://gitcode.com/gh_mirrors/su/SunnyUI点击查看免费下载相关推荐header-only设计rapidjson零依赖的C JSON解决方案header only设计rapidjson零依赖的C JSON解决方案 还在为C项目中的JSON解析依赖问题而烦恼吗每次引入第三方库都要处理复杂的序列化Topcoat 0.6 版本亮点抢先看Topcoat 生态最新动态Topcoat 0.6 版本亮点抢先看Topcoat 生态最新动态 Topcoat 是一款面向 Rust 的电池齐全batteries included后端Web框架SSR告别JSON依赖Requests超实用MsgPack序列化技巧告别JSON依赖Requests超实用MsgPack序列化技巧 你是否还在为API传输效率低而烦恼还在忍受JSON格式的冗余数据本文将带你掌握Reques后端网络通信上一篇Obsidian LiveSync实战如何搭建完全自托管的笔记同步系统下一篇LikeC4代码审查架构变更的自动化验证流程终极指南 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表