Skip to content

序列化与反序列化

微软提供了两个 序列化与反序列化 的包,分别是 Newtonsoft.JsonSystem.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);

未格式化:

Untitled.png

格式化后:

Untitled 1.png

属性名 格式化

在某些情况下,我们需要将对象的属性名序列化为不同的名称。可以使用 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);

未格式化:

Untitled 2.png

格式化后:

Untitled 3.png


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}");
}

Released under the MIT License.