使用 System.Text.Json 序列化和反序列化Json

c#

首先需要引入命名空间 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
    {
        //
    });
}

Related Posts

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注