using System.Text.Json;
public class User
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public DateTime CreatedAt { get; set; }
}
var user = new User
{
Id = 1,
Name = "Alice",
CreatedAt = DateTime.UtcNow
};
// 序列化:对象 → JSON 字符串
string json = JsonSerializer.Serialize(user, new JsonSerializerOptions { WriteIndented = true });
Console.WriteLine(json);
// 反序列化:JSON 字符串 → 对象
User? copy = JsonSerializer.Deserialize<User>(json);
Console.WriteLine(copy?.Name); // Alice
using System.Xml.Serialization;
var serializer = new XmlSerializer(typeof(User));
using var writer = new StringWriter();
serializer.Serialize(writer, user); // 对象 → XML
string xml = writer.ToString();
using var reader = new StringReader(xml);
User? copy = (User?)serializer.Deserialize(reader); // XML → 对象
[JsonInclude] public string Name { get; private set; }
[JsonConverter]
System.Text.Json
指定自定义转换器
[JsonConverter(typeof(JsonStringEnumConverter))]
[JsonConstructor]
System.Text.Json
指定反序列化构造函数
[JsonConstructor] public User(int id) { }
[JsonExtensionData]
System.Text.Json
捕获未知 JSON 属性
public Dictionary<string, JsonElement>? Extra { get; set; }
[JsonPolymorphic] / [JsonDerivedType]
System.Text.Json
多态序列化,.NET 7+
[JsonDerivedType(typeof(Dog), "dog")]
[JsonProperty]
Newtonsoft.Json
指定名称、顺序、是否必需
[JsonProperty("user_name")]
[DataContract] / [DataMember]
System.Runtime.Serialization
选择加入,控制名称/顺序
[DataMember(Name = "name", Order = 1)]
[XmlElement] / [XmlAttribute] / [XmlIgnore]
System.Xml.Serialization
控制 XML 映射
[XmlAttribute("id")]
[Serializable]
System
标记可二进制序列化(旧)
不推荐用于 BinaryFormatter
[ProtoContract] / [ProtoMember]
protobuf-net
Protobuf 契约
[ProtoMember(1)]
3.2 常用选项总览
选项
作用
常用值
WriteIndented
输出缩进 JSON
true
PropertyNamingPolicy
属性命名策略
JsonNamingPolicy.CamelCase
PropertyNameCaseInsensitive
反序列化大小写不敏感
true
DefaultIgnoreCondition
默认忽略条件
JsonIgnoreCondition.WhenWritingNull
ReferenceHandler
循环引用处理
ReferenceHandler.IgnoreCycles
Converters
自定义转换器集合
new JsonStringEnumConverter()
Encoder
字符编码策略
JavaScriptEncoder.UnsafeRelaxedJsonEscaping
NumberHandling
数字读取策略
JsonNumberHandling.AllowReadingFromString
IncludeFields
包含公共字段
true
TypeInfoResolver
类型元数据解析
源生成 AppJsonContext.Default
3.3 实战代码示例
csharp复制代码
using System.Text.Json;
using System.Text.Json.Serialization;
public class Order
{
[JsonPropertyName("order_id")]
public int Id { get; set; }
[JsonIgnore]
public decimal InternalCost { get; set; } // 该属性不会被序列化
public string? CustomerName { get; set; }
[JsonConverter(typeof(JsonStringEnumConverter))] // 枚举输出为字符串
public OrderStatus Status { get; set; }
}
public enum OrderStatus
{
Pending,
Paid,
Shipped
}
var options = new JsonSerializerOptions
{
WriteIndented = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
PropertyNameCaseInsensitive = true
};
var order = new Order
{
Id = 1001,
InternalCost = 30,
CustomerName = "张三",
Status = OrderStatus.Paid
};
string json = JsonSerializer.Serialize(order, options);
Console.WriteLine(json);
Order? back = JsonSerializer.Deserialize<Order>(json, options);
using System.Text.Json.Serialization;
[JsonPolymorphic(TypeDiscriminatorPropertyName = "$type")]
[JsonDerivedType(typeof(Dog), "dog")]
[JsonDerivedType(typeof(Cat), "cat")]
public abstract class Animal
{
public string Name { get; set; } = string.Empty;
}
public class Dog : Animal
{
public bool CanBark { get; set; }
}
public class Cat : Animal
{
public bool CanMeow { get; set; }
}