序列化与反序列化
微软提供了两个 序列化与反序列化 的包,分别是 Newtonsoft.Json
和 System.Text.Json
。
推荐使用 System.Text.Json
包,因为微软正在将前者的功能往后者中迁移。
Newtonsoft.Json
序列化
序列化就是将 对象类型转换为 json字符串。
C#
public record Person(string Name, int Age);
C#
Person person = new Person("王一博", 40);
string? json = JsonConvert.SerializeObject(person);
反序列化
反序列化就是将 json字符串转换为对象类型。
C#
string str = "{\"Name\":\"王一博\",\"Age\":40}";
object? obj = JsonConvert.DeserializeObject(str);
格式化
序列化时 格式化
JsonConvert.SerializeObject
的第二个参数 Formatting
是用来设置 JSON 字符串的格式化选项的。
如果想在输出时进行格式化,可以将 Formatting 设置为Formatting.Indented
。
C#
Person person = new Person("王一博", 40);
string? json = JsonConvert.SerializeObject(person, Formatting.Indented);
未格式化:
格式化后:
属性名 格式化
在某些情况下,我们需要将对象的属性名序列化为不同的名称。可以使用 JsonPropertyAttribute
来指定序列化时的属性名。
C#
public class Person
{
[JsonProperty(PropertyName = "personName")]
public string? Name { get; set; }
[JsonProperty(PropertyName = "personAge")]
public int Age { get; set; }
}
string? res = JsonConvert.SerializeObject(person, Formatting.Indented); // 运行结果见上图
日期 格式化
C#
public class Person
{
public string? Name { get; set; }
public int Age { get; set; }
public DateTime Time { get; set; }
}
C#
Person person = new Person
{
Name = "王一博",
Age = 30,
Time = DateTime.Now
};
var settings = new JsonSerializerSettings
{
DateFormatString = "yyyy-MM-dd HH:mm:ss" // 设置日期格式化字符串
};
string? res = JsonConvert.SerializeObject(person, Formatting.Indented, settings);
未格式化:
格式化后:
System.Text.Json(推荐)
序列化
C#
public record Person(string Name, string Age, string Hobby);
C#
var obj = new Person("sunny", "20", "Singsong");
string json = JsonSerializer.Serialize(obj);
反序列化
C#
string jsonString = "{\"Name\":\"sunny\",\"Age\":\"20\",\"Hobby\":\"Singsong\"}";
// 需要指定泛型
var person = JsonSerializer.Deserialize<Person>(jsonString);
字典的序列化
序列化
C#
var dictionary = new Dictionary<string, string>()
{
{ "Name", "sunny" },
{ "Age", "25" },
{ "Hobby", "Singsong" }
};
string json = JsonSerializer.Serialize(dct);
反序列化
C#
string jsonString = "{\"Name\":\"sunny\",\"Age\":\"20\",\"Hobby\":\"Singsong\"}";
var deserializedObj = JsonSerializer.Deserialize<Dictionary<string, string>>(jsonString);
foreach (var (key, value) in deserializedObj)
{
Console.WriteLine($"{key}: {value}");
}