首先需要引入命名空间 System.Text.Json, 部分功能还需要引入 System.Text.Json.Serialization
默认
//序列化
string str = JsonSerializer.Serialize(data);
//反序列化,需要建一个JsonData的类
JsonSerializer.Deserialize<JsonData>(str)
驼峰式命名(首字母小写)
str= JsonSerializer.Serialize(data,new JsonSerializerOptions {
//属性名使用驼峰式命名
PropertyNamingPolicy= JsonNamingPolicy.CamelCase,
//字典的Key使用驼峰式命名
DictionaryKeyPolicy = JsonNamingPolicy.CamelCase
});
格式化字符串
str = JsonSerializer.Serialize(data, new JsonSerializerOptions
{
//使用缩进的方式格式化字符串
WriteIndented= true,
});
枚举
枚举默认是序列化成数字,如果想序列化成字符串,可以使用JsonStringEnumConverter,此处的字符串并不是将数字转成字符串,而是使用枚举的名称,比如:
public enum Gender
{
Male,
Female
}
默认是序列化成0和1,如果使用JsonStringEnumConverter,则是序列化成Male和Female。
如下:
str = JsonSerializer.Serialize(data, new JsonSerializerOptions
{
Converters =
{
new JsonStringEnumConverter()
//也可以使用参数JsonNamingPolicy.CamelCase将枚举变成首字母小写
//new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
}
});
反序列化也是一样使用该JsonStringEnumConverter,此时不管是数字还是枚举名称都能正确的反序列化成对应的枚举值,而且对于枚举名称并不区分大小写,因此使不使用JsonNamingPolicy.CamelCase并没有区别。
忽略null值
如果想序列化的时候排除null值的字段,可以使用以下参数:
str = JsonSerializer.Serialize(data, new JsonSerializerOptions
{
DefaultIgnoreCondition= JsonIgnoreCondition.WhenWritingNull
});
忽略指定属性
在指定的属性上加上 [JsonIgnore] 修饰符即可。
反序列化属性名忽略大小写
JsonSerializer.Deserialize<JsonData>(str, new JsonSerializerOptions
{
PropertyNameCaseInsensitive= true,
});
反序列化支持数字字符串
反序列化时,数字123和字符串"123"默认是不同的,如果需要兼容数字字符串,需要设置NumberHandling,如下:
JsonSerializer.Deserialize<JsonData>(str, new JsonSerializerOptions
{
NumberHandling = JsonNumberHandling.AllowReadingFromString
});
反序列化支持注释
JsonSerializer.Deserialize<JsonData>(str, new JsonSerializerOptions
{
ReadCommentHandling = JsonCommentHandling.Skip,
AllowTrailingCommas = true,
});
Asp.net 中使用JsonSerializerOptions
如果想设置全部Controller的返回值格式,可以使用以下代码:
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.xxxx = yyyy
});
Asp.net 中的默认值与上面用到的会有些区别,比如Asp.net默认使用驼峰命名,并且反序列化时属性名不区分大小写而且支持数字字符串。
如果想单独设置某个Action的返回值格式,则只能使用JsonResult,如下:
public IActionResult GetData()
{
return new JsonResult(new { }, new System.Text.Json.JsonSerializerOptions
{
//
});
}