You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 03:27:52