在C#中使用JSON:面向初学者的解析与序列化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在C#中使用JSON简介

\n\n

JSON(JavaScript对象表示法)是一种轻量级的数据交换格式,广泛应用于Web开发、移动应用和微服务中。对于C#开发者来说,掌握JSON操作是必备技能。本文将讲解如何使用现代命名空间System.Text.Json(包含在.NET Core 3.0及以上版本,以及.NET 5/6/7/8中)进行JSON解析(反序列化)和序列化的基础知识。

\n\n

我们将讨论:

\n
    \n
  • 什么是序列化和反序列化
  • \n
  • 如何将C#对象转换为JSON字符串
  • \n
  • 如何读取JSON并将其转换回对象
  • \n
  • 处理嵌套对象和集合
  • \n
  • 错误处理与序列化配置
  • \n
\n\n

所有代码示例均适用于C#控制台应用程序(.NET 6+)。您可以复制并直接运行它们。

\n\n

1. 序列化基础:对象 → JSON

\n\n

序列化是将对象(或数据结构)转换为JSON格式字符串的过程。在C#中,使用命名空间System.Text.Json中的JsonSerializer类来实现。

\n\n

创建简单模型

\n\n

假设我们有一个Person类:

\n\n
public class Person\n{\n    public string Name { get; set; }\n    public int Age { get; set; }\n    public string Email { get; set; }\n}
\n\n

对象序列化

\n\n

现在创建一个实例并将其转换为JSON:

\n\n
using System.Text.Json;\n\nPerson person = new Person\n{\n    Name = "伊万·彼得罗夫",\n    Age = 30,\n    Email = "ivan@example.com"\n};\n\nstring jsonString = JsonSerializer.Serialize(person);\nConsole.WriteLine(jsonString);
\n\n

结果:

\n\n
{"Name":"伊万·彼得罗夫","Age":30,"Email":"ivan@example.com"}
\n\n

默认情况下,JsonSerializer对属性名称使用camelCase(首字母小写),但在我们的示例中,名称保持了大写,因为我们没有更改设置。如果您需要严格的camelCase,请使用JsonSerializerOptions:

\n\n
var options = new JsonSerializerOptions\n{\n    PropertyNamingPolicy = JsonNamingPolicy.CamelCase\n};\nstring jsonCamelCase = JsonSerializer.Serialize(person, options);\nConsole.WriteLine(jsonCamelCase);\n// {"name":"伊万·彼得罗夫","age":30,"email":"ivan@example.com"}
\n\n

2. 反序列化:JSON → 对象

\n\n

反序列化是反向过程:我们将JSON字符串转换为C#对象。

\n\n

简单反序列化示例

\n\n

假设我们从API获取了JSON:

\n\n
string jsonFromApi = @"{""Name"":""安娜·斯米尔诺娃"",""Age"":25,""Email"":""anna@test.com""}";\n\nPerson? personFromJson = JsonSerializer.Deserialize<Person>(jsonFromApi);\n\nif (personFromJson != null)\n{\n    Console.WriteLine($"姓名:{personFromJson.Name}, 年龄:{personFromJson.Age}");\n}
\n\n

请注意Person类型后的?符号——这是可为空注解,表示结果可能为null(例如,如果JSON格式不正确)。

\n\n

处理数组和列表

\n\n

JSON经常包含对象集合。假设我们有一个用户数组:

\n\n
string jsonArray = @"\n[\n    {""Name"":""奥列格"",""Age"":35},\n    {""Name"":""玛丽亚"",""Age"":28},\n    {""Name"":""德米特里"",""Age"":42}\n]";\n\nList<Person>? people = JsonSerializer.Deserialize<List<Person>>(jsonArray);\n\nif (people != null)\n{\n    foreach (var p in people)\n    {\n        Console.WriteLine($"{p.Name} - {p.Age}岁");\n    }\n}
\n\n

3. 处理嵌套对象和复杂结构

\n\n

真实的JSON数据很少是扁平的。考虑

博客

书籍推荐