首页 > 其他分享 >Newtonsoft.Json使用

Newtonsoft.Json使用

时间:2023-05-20 23:22:29浏览次数:73  
标签:Newtonsoft string get 枚举 Json set 使用 序列化 public

目录


用于记录开发过程中Newtonsoft.Json中使用的常用功能。

枚举类型序列化/反序列化

由于枚举类型的基类是值类型,因此默认情况下(无任何特性修饰)枚举类型序列化之后的值是Int32类型的数字,反序列化会把相应的数字/枚举名称转成对应的枚举。

例如:

类定义

    public class User
    {
        public int Uid
        {
            set; get;
        }
        public string Username
        {
            set; get;
        }
        public string Password
        {
            set; get;
        }
        public string Phone
        {
            set; get;
        }
        public bool Enable
        {
            set; get;
        }
        public SexType Sex
        {
            get; set;
        }
    }

    public enum SexType
    {
        Man,
        Women,
    }

测试代码和运行结果

image-20230518205603580

枚举名称转对象的结果

image-20230519092946722

调整后

    public class User
    {
        public int Uid
        {
            set; get;
        }
        public string Username
        {
            set; get;
        }
        public string Password
        {
            set; get;
        }
        public string Phone
        {
            set; get;
        }
        public bool Enable
        {
            set; get;
        }
        [JsonConverter(typeof(StringEnumConverter))]
        public SexType Sex
        {
            get; set;
        }
    }

添加了 [JsonConverter(typeof(StringEnumConverter))] 特性,运行结果

image-20230519092613894

结论

枚举类型没加[JsonConverter(typeof(StringEnumConverter))]特性时:

序列化操作

枚举类型序列化会转换为其对应的Int32的值;

反序列化操作

Int32对应的枚举类型值或枚举类型名称都可以反序列化为对应的枚举类型。

加了[JsonConverter(typeof(StringEnumConverter))]特性后

序列化操作

枚举类型序列化会转换为其对应的枚举类型名称;

反序列化操作

Int32对应的枚举类型值或枚举类型名称都可以反序列化为对应的枚举类型。

序列化后的字符串字段顺序控制

测试类

    public class User
    {
        public int Uid
        {
            set; get;
        }
        public string Username
        {
            set; get;
        }
        public string Password
        {
            set; get;
        }
        public string Phone
        {
            set; get;
        }
        public bool Enable
        {
            set; get;
        }
        [JsonConverter(typeof(StringEnumConverter))]
        public SexType Sex
        {
            get; set;
        }
    }

不处理时序列化后的字符串为

{"Uid":1,"Username":"张三","Password":"123456","Phone":"15168351735","Enable":true,"Sex":"Man"}

通过[JsonProperty(Order = 1)]控制字段序列化后的顺序

此方式可以达到预期的目的,前提是我们有序列化对象的源码,还有就是不利于扩展,在修改对象属性时需要重新数里各个属性的排序,因此此处不做过多的介绍。

通过自定义ContractResolver的方式实现

OrderedContractResolver类

        public class OrderedContractResolver : DefaultContractResolver
        {
            protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
            {
                var props = base.CreateProperties(type, memberSerialization);
                return props.OrderBy(a => a.PropertyName).ToList();
            }
        }

序列化时

            var user = new User() { Uid = 1, Username = "张三", Password = "123456", Phone = "15168351735", Enable = true, Sex = SexType.Man };
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(user, new JsonSerializerSettings()
            {
                ContractResolver = new OrderedContractResolver()
            });

输出结果
{"Enable":true,"Password":"123456","Phone":"15168351735","Sex":"Man","Uid":1,"Username":"张三"}

相关参考

  1. C#/Python Json序列化时控制字段顺序
  2. Order of serialized fields using JSON.NET

标签:Newtonsoft,string,get,枚举,Json,set,使用,序列化,public
From: https://www.cnblogs.com/lanwah/p/17418014.html

相关文章

  • pyarmor的使用
    官方文档作用:用于python脚本的加密切换到虚拟环境python3.x下(这里是用的3.6,个人开发环境下推荐使用miniconda3来实现虚拟环境管理)这里演示的脚本叫diff_demo.py,用于比较old和new这2个文件的差异1原始文件和目录如下:tree.├──diff_demo.py├──new└──oldpip......
  • 使用 Elasticsearch 的 REST API 来查询节点的内存使用情况
    curl-XGET'http://172.18.10.96:9200/_nodes/node-1/stats?pretty&human&filter_path=nodes.*.jvm.mem.heap_used_percent'{"nodes":{"WKECtNqYSuCKgHu-HNJTfg":{"jvm":{"mem":......
  • Java中的并发编程:线程池的使用与优化
    在Java编程中,处理并发任务是一项常见而重要的任务。合理地管理线程可以提高程序的性能和响应性。本文将介绍Java中线程池的使用和优化技巧,帮助开发者更好地处理并发编程的挑战。1.线程池的基本概念线程池是一种用于管理线程的技术,它通过预先创建一组线程,并将任务分配给这些线程来......
  • LeetCode 746.使用最小花费爬楼梯
    1.题目:给你一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为0或下标为1的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例1:输入:cost=[10,15,20]输出:15解释:你......
  • 使用ShardingShpere来实现读写分离跟分库分表
    环境准备两个mysql集群,一主一从我们简单的用docker-compose来快速搭建一个version:'3'services:master1:image:mysql:5.7environment:MYSQL_ROOT_PASSWORD:123456ports:-"3307:3306"volumes:-./master1/data:/var/lib/mysql......
  • 云原生之使用Docker部署etherpad文档编辑器
    (云原生之使用Docker部署etherpad文档编辑器)一、Etherpad介绍1.Etherpad简介Etherpad是一个高度可定制的开源在线编辑器,提供真正实时的协作编辑。2.Etherpad特点Etherpad允许您实时协作编辑文档,就像在浏览器中运行的实时多人编辑器一样。与您的朋友、同学或同事一起撰写......
  • ABBAC900F学习笔记301:使用securityLock做解除联锁按钮的权限限制功能
    这一篇学习笔记,我在新浪博客记录过,因为担心丢失,在这里再记录一遍,新浪博客地址ABBAC900F学习笔记301:使用securityLock做解除联锁按钮的权限限制功能_来自金沙江的小鱼_新浪博客(sina.com.cn) 这个学习练习,实际上还是在以前学习基础上做的,没有多少新意,权当复习一遍吧。在虚拟......
  • 使用docker安装 rabbitmq
    在Docker中安装RabbitMQ的步骤:安装Docker:如果您还没有安装Docker,请先按照官方文档进行安装。搜索RabbitMQ镜像:打开终端并运行以下命令来搜索可用的RabbitMQDocker镜像:dockersearchrabbitmq选择要使用的RabbitMQ版本:根据您的需求,选择一个RabbitMQ版本。例如,如果您想使用RabbitMQ......
  • 面向对象的使用
    类的定义与使用(类也可以看做成一个容器)类在定义的时候定义阶段就会执行类体的代码,属于类的局部名称空间外界无法直接调用。类名加括号就会产生对象,并且每执行一次都会产生一个全新的对象(内存地址都不一样)。数据和功能也可以叫属性,数据就是属性名、功能就是方法对象.__dict__查......
  • 使用Requests模块进行微博爬虫教程【网络请求分析文档】
    目录写在前面请求热搜获取某个热搜下的内容获取长文本获取图片获取评论第一部分后续部分获取某个用户的微博第一部分后续部分后续部分写在前面该文档是某课程实验需要而整理的,各个接口分析仅凭我个人理解,各个参数以及数据的含义也只是我个人的推测,如有错误的地方,欢迎在评论区或......