C# 读取与写入 JSON 文件:基础方法与工具推荐

闻溪
闻溪
发布时间:2026-10-15| 4人浏览过
原创

本文详细介绍了 C# 环境下处理 JSON 数据的核心方案。从利用原生 IO 类库实现文件的底层读写,到使用 DataContractJsonSerializer 完成对象到字符串的序列化,最后通过 LitJson 库演示了如何高效地将 JSON 数据反序列化为强类型对象或动态结构,适用于各类配置管理场景。

C# 实现 JSON 文件的读写操作

在 C# 开发中,JSON 常用于配置文件、数据交换格式等场景。实现 JSON 文件的读写通常分为两个阶段:首先是获取或生成 JSON 字符串内容,其次是将这些内容持久化存储到文件或从文件中提取出来。以下将分别介绍用于文件流操作的辅助方法以及对象转换逻辑。

第一步:封装文件写入函数

为了简化后续操作,可以先封装一个通用的写文件方法。该方法接收目标文件路径和已序列化的 JSON 字符串,并使用 UTF-8 编码将其保存。这种方式确保了中文及特殊字符在不同平台下的兼容性。

/// <summary>
/// 将序列化的json字符串内容写入Json文件,并且保存
/// </summary>
/// <param name="path">文件保存路径</param>
/// <param name="jsonConents">待写入的JSON字符串内容</param>
private void WriteJsonFile(string path, string jsonConents)
{
    // 使用 System.IO.File 的 WriteAllText 方法直接覆盖写入
    // Encoding.UTF8 确保文本编码正确
    File.WriteAllText(path, jsonConents, System.Text.Encoding.UTF8);
}

第二步:封装文件读取函数

读取 JSON 文件时,需要打开文件流并逐行或一次性读取内容。对于简单的 JSON 配置,直接读取整个文件内容为字符串即可。注意处理文件不存在的情况,`FileMode.OpenOrCreate` 可以防止因文件缺失导致的异常,尽管在严格业务场景中建议先检查文件是否存在。

/// <summary>
/// 从本地获取Json文件并解析返回对应的json字符串
/// </summary>
/// <param name="filepath">JSON文件路径</param>
/// <returns>文件内的完整JSON字符串</returns>
private string GetJsonFile(string filepath)
{
    string json = string.Empty;
    // 使用 using 语句块自动管理资源释放
    using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, 
        System.IO.FileAccess.ReadWrite, FileShare.ReadWrite))
    {
        using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
        {
            // 一次性读取所有文本内容
            json = sr.ReadToEnd().ToString();
        }
    }
    return json;
}

对象与 JSON 字符串的相互转换

在实际应用中,数据通常以 C# 对象的形式存在,存入 JSON 前需序列化为字符串,读出后需反序列化回对象。这里展示使用 `DataContractJsonSerializer` 进行序列化的过程。

第三步:序列化对象为 JSON 字符串

使用 `DataContractJsonSerializer` 可以将任何可序列化的对象转换为 MemoryStream,再提取字节数组转为 UTF-8 字符串。此步骤生成的字符串可直接传入上述 `WriteJsonFile` 方法。

/// <summary>
/// 将任意对象转换为标准的JSON字符串格式
/// </summary>
/// <param name="tablelList">待序列化的对象实例</param>
/// <returns>JSON格式的字符串</returns>
public string toJson(object tablelList)
{
    // 创建序列化器,指定对象的类型
    DataContractJsonSerializer json = new DataContractJsonSerializer(tablelList.GetType());
    string finJson = "";
    
    // 内存流用于暂存序列化后的数据
    using (MemoryStream stream = new MemoryStream())
    {
        json.WriteObject(stream, tablelList);
        // 将流中的字节数组转换为 UTF-8 字符串
        finJson = Encoding.UTF8.GetString(stream.ToArray());
        // 调试信息输出
        Debug.Log(tablelList + "JSON数据为:" + finJson);
    }
    return finJson;
}

以下是调用上述方法将怪物生成点列表写入配置文件的具体逻辑:

// 1. 准备数据源:定义需要写入的数据集合
List<MonsterSpawnPoint> MonsterPos = new List<MonsterSpawnPoint&gt();

// 2. 执行序列化:将列表转换为 JSON 字符串
string text = toJson(MonsterPos);

// 3. 确定路径:根据应用运行时路径拼接配置文件名
// 注意:Application.dataPath 通常指向 Assets 目录,需根据实际需求调整相对路径
string filepath = Path.Combine(Application.dataPath, "../", "Config_NPC.json");

// 4. 执行写入:调用封装好的写文件方法
WriteJsonFile(filepath, text);

生成的标准 JSON 文件结构示例如下:

[
  {
    "Direction": 0,
    "Index": 9,
    "PositionX": 28,
    "PositionY": 10,
    "PositionZ": 20
  },
  {
    "Direction": 0,
    "Index": 9,
    "PositionX": 40,
    "PositionY": 10,
    "PositionZ": 18
  }
]

JSON 数据的反序列化与解析

当需要从现有 JSON 文件中读取数据并映射到 C# 对象时,可以使用专门的 JSON 解析库。以下以常用的 `LitJson` 为例,展示两种不同的解析场景:强类型数组解析和动态键值对访问。

第四步:定义数据结构与解析

首先定义与 JSON 字段匹配的 C# 类。确保属性名与 JSON 中的 Key 一致,以便解析器正确映射。

public class MonsterSpawnPoint 
{
    public long Index;      // 对应 JSON 中的 "Index"
    public int PositionX;   // 对应 JSON 中的 "PositionX"
    public int PositionY;   // 对应 JSON 中的 "PositionY"
    public int PositionZ;   // 对应 JSON 中的 "PositionZ"
    public int Direction;   // 对应 JSON 中的 "Direction"
}

接着,通过 `GetJsonFile` 获取原始字符串后,使用 `LitJson.JsonMapper.ToObject` 进行转换:

  • 强类型解析:直接将字符串转换为特定类型的数组或列表,适合结构固定且已知的数据。
    // 将整个 JSON 数组解析为 MonsterSpawnPoint 数组
    MonsterSpawnPoint[] monsterPoints = LitJson.JsonMapper.ToObject<MonsterSpawnPoint[]>(GetJsonFile(filepath));
  • 动态解析:对于结构嵌套复杂或字段不确定的数据,可以使用 `JsonData` 进行动态遍历和取值。
    // 解析为动态数据类型
    LitJson.JsonData jsonData = LitJson.JsonMapper.ToObject(GetJsonFile(filepath));
    
    // 遍历每个条目
    foreach (JsonData item in jsonData)
    {
        // 通过字符串索引访问具体字段的值
        JsonData id_data = item["Id"];
        // 条件判断示例:根据类型选择不同的字段名
        JsonData name_data = (type == InitType.Monster) ? item["Name"] : item["NPCName"];
        
        // 组装界面选项数据
        Dropdown.OptionData tempData = new Dropdown.OptionData();
        tempData.text = $"[{id_data}]{name_data}";
    }

总结

以上为 C# 实现读取与写入 JSON 文件的详细内容。通过组合底层的 IO 操作与特定的序列化/反序列化库(如 DataContractJsonSerializer 或 LitJson),可以灵活地处理各种数据持久化需求。更多关于 C# 数据处理的技术资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。