C# Class写入Json文件及解析实战

清欢
清欢
发布时间:2026-10-15| 5人浏览过
原创

在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数组形式 ( [{},{}])

如果源数据是一个包含多个对象的数组(即 [{...}, {...}]),可采用以下三种方式:

  1. 使用DataTable:
    // 注意需要处理 DataTable 引用
    DataTable dt = JsonConvert.DeserializeObject<DataTable>(jsonArrayString);
  2. 使用JArray遍历:
相关标签:

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

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 算法库。