在C#中使用JSON简介
\n\nJSON(JavaScript对象表示法)是一种轻量级的数据交换格式,广泛应用于Web开发、移动应用和微服务中。对于C#开发者来说,掌握JSON操作是必备技能。本文将讲解如何使用现代命名空间System.Text.Json(包含在.NET Core 3.0及以上版本,以及.NET 5/6/7/8中)进行JSON解析(反序列化)和序列化的基础知识。
我们将讨论:
\n- \n
- 什么是序列化和反序列化 \n
- 如何将C#对象转换为JSON字符串 \n
- 如何读取JSON并将其转换回对象 \n
- 处理嵌套对象和集合 \n
- 错误处理与序列化配置 \n
所有代码示例均适用于C#控制台应用程序(.NET 6+)。您可以复制并直接运行它们。
\n\n1. 序列化基础:对象 → JSON
\n\n序列化是将对象(或数据结构)转换为JSON格式字符串的过程。在C#中,使用命名空间System.Text.Json中的JsonSerializer类来实现。
创建简单模型
\n\n假设我们有一个Person类:
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\nusing 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:
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\n2. 反序列化:JSON → 对象
\n\n反序列化是反向过程:我们将JSON字符串转换为C#对象。
\n\n简单反序列化示例
\n\n假设我们从API获取了JSON:
\n\nstring 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\nJSON经常包含对象集合。假设我们有一个用户数组:
\n\nstring 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\n3. 处理嵌套对象和复杂结构
\n\n真实的JSON数据很少是扁平的。考虑