使用 System.Text.Json 处理 JSON(选择加入与转换器)
适合 C# 6 的 JSON 处理:使用带有 [DataContract]/[DataMember] 的 DataContractJsonSerializer(选择加入成员),并通过类似转换器的方式进行简单的命名调整。
使用 System.Text.Json 处理 JSON(选择加入与转换器) 是 CoddyKit 上的免费 C# Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 3 节课。
C# 6 中的 JSON:计划
目标:不使用外部包来序列化和反序列化 JSON。
- 使用 DataContractJsonSerializer
- 通过 DataMember 选择性包含成员
- 使用 Name= 自定义名称
- 安全地从文件读取和写入
选择性包含模型
选择性包含模型:使用 DataContract 标记类型,并仅使用 DataMember 标记要包含的成员。使用 Name= 控制 JSON 键名。
using System;
using System.Runtime.Serialization;
[DataContract] // opt-in: only [DataMember] will be serialized
public sealed class User
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
// Not included: no DataMember
public string InternalNote { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
User u = new User { Id = 7, Name = "Ada", InternalNote = "hidden" };
Console.WriteLine("Ready to serialize: " + u.Name);
}
}
序列化为 JSON
创建 DataContractJsonSerializer,写入流,然后将其以 UTF-8 编码为字符串。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
[DataContract]
public sealed class User
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
public string InternalNote { get; set; }
}
public class Program
{
public static string ToJson(User u)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));
using (MemoryStream ms = new MemoryStream())
{
ser.WriteObject(ms, u);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
public static void Main(string[] args)
{
User u = new User { Id = 1, Name = "Ada", InternalNote = "not saved" };
string json = ToJson(u);
Console.WriteLine(json); // {"id":1,"name":"Ada"}
}
}
从 JSON 反序列化
通过从流中读取来进行反序列化。只有使用 DataMember 标记的字段会被填充。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
[DataContract]
public sealed class User
{
[DataMember(Name = "id")]
public int Id { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
}
public class Program
{
public static User FromJson(string json)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(User));
byte[] bytes = Encoding.UTF8.GetBytes(json);
using (MemoryStream ms = new MemoryStream(bytes))
{
return (User)ser.ReadObject(ms);
}
}
public static void Main(string[] args)
{
string json = "{\"id\":42,\"name\":\"Bob\"}";
User u = FromJson(json);
Console.WriteLine(u.Id + " - " + u.Name);
}
}
保存和加载 JSON 文件
在 using 代码块中使用 FileStream 持久化 JSON。这与真实应用的做法一致,例如保存设置和少量数据等。
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
[DataContract]
public sealed class Settings
{
[DataMember(Name = "theme")]
public string Theme { get; set; }
[DataMember(Name = "notifications")]
public bool Notifications { get; set; }
}
public class Program
{
public static void Save(string path, Settings s)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Settings));
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
ser.WriteObject(fs, s);
}
}
public static Settings Load(string path)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Settings));
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
return (Settings)ser.ReadObject(fs);
}
}
public static void Main(string[] args)
{
string path = "settings.json";
Save(path, new Settings { Theme = "dark", Notifications = true });
Settings loaded = Load(path);
Console.WriteLine(loaded.Theme + " / " + loaded.Notifications);
}
}
命名与简单转换
自定义:
- 在 DataMember 中使用 Name= 映射属性名称(例如 user_name)
- 对于枚举,为每个值使用 EnumMember 标记
- 对于特殊格式(日期、数字),在 C# 6 中将其转换为字符串属性(手动映射)
JSON 的选择性包含规则
回顾
回顾:在 C# 6 中使用 DataContractJsonSerializer,通过 DataMember 选择性包含成员,使用 Name= 调整名称,并采用安全的流模式进行读写。
用 AI 导师学习 C# — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 93
- 课程
- 346
常见问题解答
「使用 System.Text.Json 处理 JSON(选择加入与转换器)」课时是免费的吗?
是的 — 「使用 System.Text.Json 处理 JSON(选择加入与转换器)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 3 节课。
「使用 System.Text.Json 处理 JSON(选择加入与转换器)」这节课中我会学到什么?
适合 C# 6 的 JSON 处理:使用带有 [DataContract]/[DataMember] 的 DataContractJsonSerializer(选择加入成员),并通过类似转换器的方式进行简单的命名调整。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。
「使用 System.Text.Json 处理 JSON(选择加入与转换器)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- System.IO(路径与流)
- 使用 System.Text.Json 处理 JSON(选择加入与转换器)
- 简单的 CSV 解析模式