C# Class写入Json文件及解析实战
在C#开发中,将自定义类(Class)序列化为JSON文件是实现数据存储和传输的常用手段。本文详解如何利用 JSON.NET 等工具进行格式化写入,并系统梳理了基于实体类的序列化、基于 JObject 的动态解析以及针对JSON数组的处理策略,提供完整的代码示例。
核心原理:将C#对象转为JSON文件
在实际项目中,我们常需要将复杂的业务对象持久化。直接输出默认的JSON字符串通常缺乏可读性。以下方法通过引入 JsonSerializer 实现对象的深度序列化与格式化重写,确保生成的JSON文件结构清晰且易于阅读。
第1步:初始化JSON对象
public static void ConvertToJson(object obj, string savePath)
{
//1. 初步序列化,获取原始JSON字符串
string str = JsonConvert.SerializeObject(obj);
//2. 创建JSON序列化器实例
JsonSerializer jsonSerializer = new JsonSerializer();
TextReader textReader = new StringReader(str);
JsonTextReader jsonTextReader = new JsonTextReader(textReader);
//3. 反序列化回对象中间态(用于格式重构)
object _object = jsonSerializer.Deserialize(jsonTextReader);
if (_object != null)
{
//4. 使用StringWriter接收重新格式化的输出
StringWriter stringWriter = new StringWriter();
using (JsonTextWriter jsonWriter = new JsonTextWriter(stringWriter))
{
//设置缩进参数:4个空格缩进,使用单行缩进
jsonWriter.Formatting = Formatting.Indented;
jsonWriter.Indentation = 4;
jsonWriter.IndentChar = ' ';
//执行最终序列化
jsonSerializer.Serialize(jsonWriter, _object);
}
//5. 将结果写入指定路径的文件
File.WriteAllText(savePath, stringWriter.ToString());
}
}该方法确保了数据的轻量级与高可读性。相比XML,JSON在Web数据传输中具有天然的简洁优势
。
C# 操作JSON的多种实践方式
为了全面覆盖不同的开发场景,我们先设定一个基础的数据结构与对应的C#实体类作为测试样本:
{
"name": "张三",
"age": 20,
"idCard": "123456789",
"birthday": "2021-01-01 00:00:00",
"hobbys": [
{ "sort": 1, "desc": "写字" },
{ "sort": 2, "desc": "游泳" }
]
}对应的C#实体定义如下:
private class Student
{
public string name { get; set; }
public int age { get; set; }
public string idCard { get; set; }
public DateTime birthday { get; set; }
public List<Hobby> hobbys { get; set; }
}
private class Hobby
{
public int sort { get; set; }
public string desc { get; set; }
}第一种方式:使用JavaScriptSerializer
这是 .NET Framework 早期的内置方案,无需引用外部第三方库。
- 准备条件:需添加引用
System.Web.Extensions,导入命名空间using System.Web.Script.Serialization;。 - 操作步骤:
// 读取JSON文件内容
string json = File.ReadAllText("d:\\json.txt");
JavaScriptSerializer jss = new JavaScriptSerializer();
// 反序列化:将JSON字符串转为Student对象
Student student = jss.Deserialize<Student>(json);
Console.WriteLine(student.name); // 输出: 张三
// 序列化:将对象转回JSON字符串
string resultJson = jss.Serialize(student);
Console.WriteLine(resultJson);第二种方式:使用JSON.NET (推荐)
Newtonsoft.Json 是业界标准库,性能更优且API设计更加友好。
- 准备条件:需安装 NuGet 包
Newtonsoft.Json,导入命名空间using Newtonsoft.Json;。 - 操作步骤:
// 反序列化 Student student = JsonConvert.DeserializeObject<Student>(json); Console.WriteLine(student.name); // 序列化 string resultJson = JsonConvert.SerializeObject(student); Console.WriteLine(resultJson);
进阶:无实体类的动态解析与数组处理
当数据结构频繁变动或不想手动维护大量DTO类时,可以使用JSON.NET提供的动态类:JObject 和 JArray。
如何解析单层嵌套数据 (JObject)
直接解析为 JObject 树,通过Key索引获取Value,无需定义对应字段:
// 解析主节点 JObject jobj = JObject.Parse(json); Console.WriteLine(jobj["name"].ToString()); // 解析嵌套数组 JArray jarr = JArray.Parse(jobj["hobbys"].ToString()); // 对 jarr 进行循环迭代即可获取具体爱好信息 // 反向构建:创建新的 JSON 对象 JObject newObj = new JObject(); newObj["name"] = "李四"; newObj["age"] = 25; Console.WriteLine(newObj.ToString());
如何处理JSON数组形式 ( [{},{}])
如果源数据是一个包含多个对象的数组(即 [{...}, {...}]),可采用以下三种方式:
- 使用DataTable:
// 注意需要处理 DataTable 引用 DataTable dt = JsonConvert.DeserializeObject<DataTable>(jsonArrayString);
- 使用JArray遍历:
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













