C# 读取与写入 JSON 文件:基础方法与工具推荐
本文详细介绍了 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>();
// 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# 数据处理的技术资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









