有条件地 [JsonIgnore]

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有条件地 [JsonIgnore]相关的知识,希望对你有一定的参考价值。

前言

通常,在进行 JSON 序列化或反序列化时,如果要忽略某个属性,我们会使用 [JsonIgnore] 特性:

public class User

    public int Id  get; set; 
    [JsonIgnore]
    public string Name  get; set; 


var user = new User  Id = 1, Name = "MyIO" ;
Console.WriteLine(JsonSerializer.Serialize(user));

//输出
"Id":1

偶然发现, [JsonIgnore] 特性还可以指定 Condition 属性:

[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public string Name  get; set; 

那么它有什么作用呢?

JsonIgnoreCondition 枚举

可以通过设置 [JsonIgnore] 特性的 Condition 属性来指定条件排除。Condition 属性对应的 JsonIgnoreCondition 枚举提供下列选项:

  • Always - 始终忽略属性。如果未指定 Condition,则默认此选项

  • Never - 忽略全局设置,始终序列化和反序列化属性

public class A

    public string Name  get;  = "MyIO";


public class B

    [JsonIgnore( Condition = JsonIgnoreCondition.Never)]
    public string Name  get;  = "MyIO";


//全局设置为忽略只读属性
var options = new JsonSerializerOptions

    IgnoreReadOnlyProperties = true
;

Console.WriteLine(JsonSerializer.Serialize(new A(), options));
Console.WriteLine(JsonSerializer.Serialize(new B(), options));

//输出
//A 中的 Name 不会序列化,而 B 中的 Name 还是会序列化

"Name":"B"
  • WhenWritingDefault - 如果属性值是该属性数据类型的默认值,则在序列化中忽略属性

public class User

    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
    public int Id  get; set; 

    public string Name  get; set; 


var user = new User  Id = 0, Name = "" ;
Console.WriteLine(JsonSerializer.Serialize(user));

//输出
"Name":""
  • WhenWritingNull - 如果属性值是 null,则在序列化中忽略属性

public class User


    public int Id  get; set; 

    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
    public string Name  get; set; 


var user = new User  Id = 1, Name = null ;
Console.WriteLine(JsonSerializer.Serialize(user));

//输出
"Id":1

结论

我们还可以使用 JsonSerializerOptions 全局设置忽略属性的方式:

  • DefaultIgnoreCondition - 默认的JsonIgnoreCondition,默认值为 Never

  • IgnoreReadOnlyProperties - 忽略所有只读属性

添加微信号【MyIO666】,邀你加入技术交流群

以上是关于有条件地 [JsonIgnore]的主要内容,如果未能解决你的问题,请参考以下文章

@JsonIgnore

@JsonIgnore的源码说明

@JsonIgnore 和 @JsonIgnoreProperties 有啥区别

@JsonIgnore注解

Spring @JsonIgnore 不起作用

Spring:无法持久使用@JsonIgnore 注释的实体