• C# | 使用Json序列化对象时忽略只读的属性


    C# 使用Json序列化对象时忽略只读的属性

    前言

    将对象序列化成为Json字符串是一个使用频率非常高的功能。Json格式具有很高的可读性,同时相较于XML更节省空间。
    在开发过程中经常会遇到需要保存配置的场景,比如将配置信息保存在配置类型的实例中,再将这个对象序列化成为Json字符串并保存。当需要加载配置时,则是读取Json格式的字符串再将其还原成配置对象。在序列化的过程中,默认会将所有公开的属性和字段都序列化进入Json字符串中,这其中也会包含只读的属性或字段,而只读的属性和字段在反序列化的过程中其实是无意义的,也就是说这一部分存储是多余的。
    本文将讲解如何在执行Json序列化时,忽略掉那些只读的属性和字段。


    示例

    修改前

    创建一个student类型,包含四个属性,分别是ID,名称,生日和年龄。
    其中年龄是根据生日计算得出的,是一个只读的属性。
    使用序列化时的默认配置,编代码如下:嗯

        public class Student
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public DateTime Birthday { get; set; }
            public int Age => DateTime.Now.Year - Birthday.Year;
        }
    
        internal class Program
        {
            static void Main(string[] args)
            {
                Student student = new Student()
                {
                    Id = 1,
                    Name = "张三",
                    Birthday = DateTime.Parse("2008-08-08"),
                };
    
                Console.WriteLine(JsonConvert.SerializeObject(student,Formatting.Indented));
                Console.Read();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    执行结果如下图所示,可以看到,只读的年龄属性也被序列化到了Json字符串中。
    在这里插入图片描述

    修改后

    第一步:创建一个用于过滤只读属性的ContractResolver;
    第二步:在序列化之前,创建一个Json序列化配置对象,并将刚才编写的ContractResolver放入配置中;
    第三步:执行序列化是传入配置对象;

    完整代码如下所示:

        public class Student
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public DateTime Birthday { get; set; }
            public int Age => DateTime.Now.Year - Birthday.Year;
        }
    
        internal class Program
        {
            static void Main(string[] args)
            {
                Student student = new Student()
                {
                    Id = 1,
                    Name = "张三",
                    Birthday = DateTime.Parse("2008-08-08"),
                };
    
                var settings = new JsonSerializerSettings()
                {
                    ContractResolver = new WritablePropertiesOnlyResolver()
                };
    
                Console.WriteLine(JsonConvert.SerializeObject(student, Formatting.Indented, settings));
                Console.Read();
            }
        }
    
        class WritablePropertiesOnlyResolver : DefaultContractResolver
        {
            protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
            {
                IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
                return props.Where(p => p.Writable).ToList();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    运行结果如下:
    在这里插入图片描述
    至此,我们成功过滤了所有的只读属性。

  • 相关阅读:
    【软考学习6】计算机存储结构——局部性原理、Cache、主存地址单元、磁盘存取、总线和可靠性
    前端无法渲染CSS文件
    【安全狐】Windows隐藏计划任务技术及排查方法
    Day50【动态规划】123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
    Day13 | 每天五道题
    SpringCloud (三) ——Nacos注册中心
    含文档+PPT+源码等]精品spring boot汽车销售管理系统[包运行成功]程序设计源码计算机毕设
    我的创作纪念日
    手机资讯:华为Mate60 Pro上手体验三天的使用体验
    杭电oj 2049 不容易系列之(4)——考新郎 C语言
  • 原文地址:https://blog.csdn.net/lgj123xj/article/details/126089821