ASP.NET Core 3.1 如何实现动态结构JSON文件的读写
ASP.NET Core 3.1 动态结构JSON文件读写实现方案
针对结构不固定、字段动态可变的JSON文件读写场景,不需要提前定义固定C#实体类,可直接采用以下两种成熟方案实现,适配如下给出的JSON结构:
{ "IpAddress": ".....", "Port": 5000, "tracks": { "audio1": "track1.mp3", "audio2": "track2.mp3" } }
方案1:内置System.Text.Json实现(无第三方依赖,性能优先)
ASP.NET Core 3.1默认集成System.Text.Json组件,无需额外安装依赖包,通过ExpandoObject动态类型即可支持可变结构的序列化与反序列化。
实现代码
首先引入所需命名空间:
using System.Text.Json; using System.Dynamic; using System.IO; using System.Collections.Generic;
读取JSON文件操作:
// 读取目标JSON文件原始内容 string jsonRaw = File.ReadAllText("your-file-path.json"); // 反序列化为动态对象,无需绑定固定实体类 dynamic jsonData = JsonSerializer.Deserialize<ExpandoObject>(jsonRaw, new JsonSerializerOptions { PropertyNameCaseInsensitive = true, ReadCommentHandling = JsonCommentHandling.Skip }); // 读取已知固定字段 string ip = jsonData.IpAddress; int port = jsonData.Port; // 遍历tracks节点下的所有动态键值对 IDictionary<string, object> tracks = jsonData.tracks as IDictionary<string, object>; foreach (var trackItem in tracks) { string trackKey = trackItem.Key; // 匹配audio1、audio2这类动态键 string trackPath = trackItem.Value.ToString(); // 匹配track1.mp3这类值 } // 动态新增、修改任意结构的字段,无需提前定义 jsonData.Description = "运行时动态新增的顶层字段"; tracks["audio3"] = "track3.mp3"; // 给嵌套的tracks节点动态加新音频项
写入JSON文件操作:
// 将修改后的动态对象序列化为格式化的JSON字符串 string outputJson = JsonSerializer.Serialize(jsonData, new JsonSerializerOptions { WriteIndented = true }); // 写入回原文件 File.WriteAllText("your-file-path.json", outputJson);
方案特点:无第三方依赖,序列化/反序列化性能比第三方库高30%以上,嵌套动态对象会自动转换为嵌套ExpandoObject,支持多层级动态结构。
方案2:Newtonsoft.Json实现(API更灵活,兼容性优先)
如果项目已有Newtonsoft.Json使用基础,或需要更丰富的动态JSON操作能力,可先安装Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet包适配ASP.NET Core 3.1,通过JObject类型实现动态结构操作。
实现代码
首先引入所需命名空间:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.IO;
读取JSON文件操作:
string jsonRaw = File.ReadAllText("your-file-path.json"); // 直接解析为可动态操作的JObject实例 JObject jsonData = JObject.Parse(jsonRaw); // 读取已知固定字段 string ip = jsonData["IpAddress"].ToString(); int port = jsonData["Port"].Value<int>(); // 遍历tracks节点下的所有动态属性 JToken tracksNode = jsonData["tracks"]; foreach (JProperty trackProp in tracksNode.Children<JProperty>()) { string trackKey = trackProp.Name; string trackPath = trackProp.Value.ToString(); } // 支持动态增、删、改任意层级字段 jsonData["UpdateTime"] = DateTime.Now.ToString(); // 新增顶层字段 tracksNode["audio3"] = "track3.mp3"; // 新增嵌套字段 jsonData.Remove("Port"); // 删除已有字段
写入JSON文件操作:
string outputJson = jsonData.ToString(Formatting.Indented); File.WriteAllText("your-file-path.json", outputJson);
方案特点:动态操作API更丰富,支持节点删除、多JSON合并、路径查询、格式容错处理,适合JSON结构变动频繁、需要做复杂节点处理的场景。
实操注意事项
- 多请求并发读写同一个JSON文件时,需加文件读写锁,避免文件占用冲突或内容损坏
- 写入文件前建议先备份原文件,避免序列化异常导致原文件内容丢失
- 字段名匹配默认区分大小写,可根据需要配置序列化选项开启大小写不敏感匹配
内容的提问来源于stack exchange,提问作者Elchin
相关产品推荐
相关产品推荐

