最推荐使用System.Text.Json(.NET Core 3.0+内置),性能好、安全、轻量;老项目或需字段支持、循环引用等可选Newtonsoft.Json。

C#怎么将对象序列化为JSON C#对象与JSON互转方法  第1张

在C#中,对象与JSON互转最常用、最推荐的方式是使用 System.Text.Json(.NET Core 3.0+ 内置,无需额外安装),它性能好、安全、轻量。如果项目还在用 .NET Framework 或需要更多功能(比如支持字段、循环引用、自定义转换器更灵活),也可以用 Newtonsoft.Json(即 Json.NET)。

用 System.Text.Json 序列化对象为 JSON

这是现代 C# 的首选方式,简单高效:

  • 确保 using System.Text.Json;
  • 调用 JsonSerializer.Serialize(obj) 即可转成 JSON 字符串
  • 支持选项配置,比如格式化输出、忽略 null 值、处理大小写

示例:

var person = new { Name = "张三", Age = 28 };
string json = JsonSerializer.Serialize(person, new JsonSerializerOptions
{
    WriteIndented = true,
    DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
});

输出:
{ "Name": "张三", "Age": 28 }

用 System.Text.Json 反序列化 JSON 为对象

把 JSON 字符串还原成 C# 对象(需有匹配的类型或用匿名/动态类型):

  • JsonSerializer.Deserialize(json),T 是目标类型(类、记录、匿名类型等)
  • 若类型不完全匹配,可配合 JsonSerializerOptions 设置属性名映射(如 PascalCase ↔ camelCase)
  • 注意:默认只支持 public 属性,不支持字段;无参构造函数不是必须(但推荐有)

示例:

string json = @"{""name"":""李四"",""age"":30}";
var person = JsonSerializer.Deserialize(json, new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true
});

用 Newtonsoft.Json(Json.NET)做互转(兼容老项目)

需通过 NuGet 安装 Newtonsoft.Json 包。它的 API 更灵活,历史生态更广:

  • 序列化:JsonConvert.SerializeObject(obj, Formatting.Indented)
  • 反序列化:JsonConvert.DeserializeObject(json)
  • 支持字段、私有属性、自定义 Converter、日期格式、循环引用处理等
  • 默认自动忽略大小写,也支持 [JsonProperty("xxx")] 显式指定键名

示例:

var user = new User { UserName = "admin", CreatedAt = DateTime.Now };
string json = JsonConvert.SerializeObject(user, Formatting.Indented);

注意事项和常见问题

无论用哪个库,都需要注意:

  • 对象属性必须是 public,否则默认不参与序列化(Newtonsoft 可配)
  • DateTime 默认序列化为 ISO 8601 字符串,如需自定义格式,要配置转换器
  • 含循环引用的对象(如父子关系)会报错,需启用相应选项(Newtonsoft 支持 ReferenceLoopHandling.Ignore)
  • 反序列化时类型不匹配会抛异常,建议加 try-catch 或用 TryDeserialize(.NET 7+ 提供)
  • 敏感字段可用 [JsonIgnore] 或 JsonSerializerOptions.DefaultIgnoreCondition 排除

基本上就这些。选 System.Text.Json 是新项目的标准做法;已有项目重度依赖 Newtonsoft,也没必要强行替换。