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

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

image.png

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

@[toc]

前言

将对象序列化成为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();
        }
    }

执行结果如下图所示,可以看到,只读的年龄属性也被序列化到了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月前
|
存储 C#
C#中的序列化和反序列化
C#中的序列化和反序列化
12 0
|
1月前
|
JSON Java API
GSON 泛型对象反序列化解决方案
GSON 泛型对象反序列化解决方案
|
2月前
|
Web App开发 JSON JavaScript
SAP UI5 应用程序小技巧 - 一键将 JSON 对象导出成本地 json 文件
SAP UI5 应用程序小技巧 - 一键将 JSON 对象导出成本地 json 文件
25 0
|
1月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
66 0
|
1月前
|
消息中间件 存储 负载均衡
Kafka【付诸实践 01】生产者发送消息的过程描述及设计+创建生产者并发送消息(同步、异步)+自定义分区器+自定义序列化器+生产者其他属性说明(实例源码粘贴可用)【一篇学会使用Kafka生产者】
【2月更文挑战第21天】Kafka【付诸实践 01】生产者发送消息的过程描述及设计+创建生产者并发送消息(同步、异步)+自定义分区器+自定义序列化器+生产者其他属性说明(实例源码粘贴可用)【一篇学会使用Kafka生产者】
169 4
|
24天前
|
JSON C语言 数据格式
C语言与lua通过json对象交互
C语言与lua通过json对象交互
17 1
|
25天前
|
JSON 数据格式
Json字符串与QVariantList 对象相互转换
Json字符串与QVariantList 对象相互转换
7 0
|
1月前
|
存储 C#
C#中的序列化和反序列化案例
C#中的序列化和反序列化案例
13 0
|
1月前
|
Java C#
C#学习相关系列之多线程(七)---Task的相关属性用法
C#学习相关系列之多线程(七)---Task的相关属性用法
|
1月前
|
JSON Java Maven
使用Jackson进行 JSON 序列化和反序列化
使用Jackson进行 JSON 序列化和反序列化
27 0