三:C#对象转换Json时的一些高级(特殊)设置;

 

前面两篇分别介绍了C#转换JSON时一些常规的用法,以前我也是,只用到了前面这些比较常用的方法,没想到在转换时还有那么多特殊的设置,今天这篇内容就来讲一下一些特殊的设置,

比如,转换时过滤掉个别属性、重命名字段名称、枚举字段的处理、私有变量的转换等;

好了,开始今天的正题:

序列化时忽略特定的属性字段

需求分析:有时候在前后台或者APP直接进行数据交互的时候,不需要全部的属性内容,举个栗子,比如,只想知道用户的名字叫啥,如果把用户的年龄、性别,爱好都返回,中间的传输过程就会占用宽带,而且,其它的字段也不需要,也浪费了转换的性能。SO,还是前面文章中的对象类,咱们改进下,比如,现在我们只想要这个用户的名字叫啥,代码怎么改呢?

有两种方式可以实现,方式1:比如你去饭店,告诉老板我要这个菜,这个菜,还有那个菜。

  [JsonObject(MemberSerialization.OptIn)]   //这个标签定义了你的选菜方式,只选我要的
    public class PeopleInfo
    {

        [JsonProperty]   //这个标签标记了这个是你要选择的菜品

        public string Name { get; set; }

        [JsonProperty]   //这个标签标记了这个是你要选择的菜品

        public int Age { get; set; }

        public DateTime Birthday { get; set; }

        public EnumGender Gender { get; set; }

        public List<string> Hobby

        { get; set; }

}

【OptIn情况下,默认是将所有的属性都定义成了不要,如果这个属性需要转换成Json,需要标记JsonProperty】

转换后的结果:

方式2:就是你去饭店,告诉老板我不要这个菜,不要这个菜。

[JsonObject(MemberSerialization.OptOut)]   //这个标签定义了你的选菜方式,排除我不要的
    public class PeopleInfo
    {
        public string Name { get; set; }

        [JsonIgnore]  //这个标签标记了这个不是要想要的菜品
        public int Age { get; set; }
        [JsonIgnore]   //这个标签标记了这个不是要想要的菜品
        public DateTime Birthday { get; set; }
        public EnumGender Gender { get; set; }
        public List<string> Hobby
        { get; set; }
}

【OptOut情况下,默认是将所有的属性都定义成了要转换Json,如果这个属性不需要转换成Json,需要标记JsonIgnore】

 

序列化时更改(重命名)属性名称;

需求分析:有时候实体类中定义的属性名称可能不是想要的名称,但是又不能更改实体类中属性的名称,这个时候就可以自定义序列化字段名称。这就好比,饭店里面的一道菜菜单叫蚂蚁上树,实际上就是一道粉丝炒肉末,蚂蚁上树就是重命名的属性名称,粉丝炒肉末才是它的实体类名称;

还是复用前面的代码,稍微修改下:

public class PeopleInfo
    {
        [JsonProperty(PropertyName = "名称")] //写法1
        public string Name { get; set; }             
[JsonProperty("年龄")]   //写法2
        public int Age { get; set; }
        public DateTime Birthday { get; set; }
        public EnumGender Gender { get; set; }
        public List<string> Hobby
        { get; set; }
    }

转换后的结果:

 

 

序列化时将非公共变量(private)转换为Json;

分析:一般情况下,在进行Json转换的时候,只会对public 成员进行Json转换,默认情况下,私有成员是不转换的。