C# Academy · 课时

使用 System.Text.Json 处理 JSON(选择加入与转换器)

适合 C# 6 的 JSON 处理:使用带有 [DataContract]/[DataMember] 的 DataContractJsonSerializer(选择加入成员),并通过类似转换器的方式进行简单的命名调整。

第 2 / 3 课8 个步骤

使用 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 的选择性包含规则

快速检查:使用 DataContractJsonSerializer 时,如何只选择某些属性加入 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. System.IO(路径与流)
  2. 使用 System.Text.Json 处理 JSON(选择加入与转换器)
  3. 简单的 CSV 解析模式
← 返回 C# Academy