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();
        }
    }

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

相关文章
|
2月前
|
JSON NoSQL MongoDB
实时计算 Flink版产品使用合集之要将收集到的 MongoDB 数据映射成 JSON 对象而非按字段分割,该怎么操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
14天前
|
存储 Java
JaveSE—IO流详解:对象输入输出流(序列化及反序列化)
JaveSE—IO流详解:对象输入输出流(序列化及反序列化)
|
12天前
|
存储 JSON 测试技术
python中json和类对象的相互转化
针对python中类对象和json的相关转化问题, 本文介绍了4种方式,涉及了三个非常强大的python库jsonpickle、attrs和cattrs、pydantic,但是这些库的功能并未涉及太深。在工作中,遇到实际的问题时,可以根据这几种方法,灵活选取。 再回到结构化测试数据的构造,当需要对数据进行建模时,也就是赋予数据业务含义,pydantic应该是首选,目前(2024.7.1)来看,pydantic的生态非常活跃,各种基于pydantic的工具也非常多,建议尝试。
|
17天前
|
JSON Java fastjson
老程序员分享:java对象转json
老程序员分享:java对象转json
23 3
|
17天前
|
开发框架 .NET 编译器
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
程序与技术分享:C#基础知识梳理系列三:C#类成员:常量、字段、属性
10 2
|
21天前
|
Web App开发 JSON JavaScript
JavaScript对象常用操作JSON总结
JavaScript对象常用操作JSON总结
22 8
|
22天前
|
JSON Java 数据格式
Java中创建Json对象的方法和详细代码
Java中创建Json对象的方法和详细代码
24 1
|
5天前
|
C#
C#中使用IntPtr.Size属性来判断当前系统是32位还是64位
这段代码首先检查 `IntPtr.Size`的值,如果是4,则输出"当前系统是32位";如果是8,则输出"当前系统是64位";如果都不是,就输出"未知系统位数"。
4 0
|
1月前
|
存储 JSON JavaScript
JavaScript基础-对象与JSON
【6月更文挑战第11天】本文介绍了JavaScript对象的创建(字面量、构造函数、Class)与操作,包括属性访问和描述符。同时讲解了JSON的性质及其与JS对象的关系,以及序列化和解析过程。文章还列举了三个常见易错点(属性访问错误、JSON格式错误、循环引用)并提供了避免策略。通过代码示例展示如何操作对象和处理JSON,强调实践对于掌握这些概念的重要性。
|
11天前
|
JSON Java 数据格式
前后端数据交换,JSON基础语法和JSON数据和Java对象转换,最快的对象转换,JSON{““}字符串如何写User{id=1,username=‘zhangsan‘,password=‘123‘}
前后端数据交换,JSON基础语法和JSON数据和Java对象转换,最快的对象转换,JSON{““}字符串如何写User{id=1,username=‘zhangsan‘,password=‘123‘}