.Net Core Json序列化和反序列化以及自定义JsonConverter来转化特殊日期时间格式

2023-11-18

System.Text.Json 命名空间提供用于序列化和反序列化 JavaScript 对象表示法 (JSON) 的功能。
System.Text.Json 命名空间包含所有入口点和主要类型。 System.Text.Json.Serialization 命名空间包含用于高级方案的特性和 API,以及特定于序列化和反序列化的自定义。

.Net Core中内置了对Json的转化与解析,默认对转化出的字段(属性)区分大小写。可将PropertyNameCaseInsensitive = true

设置为不区分大小写。

新建.Net Core 3.1 控制台应用程序JsonDemo,测试代码如下:

using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace JsonDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
             * System.Text.Json 命名空间提供用于序列化和反序列化 JavaScript 对象表示法 (JSON) 的功能。
             * System.Text.Json 命名空间包含所有入口点和主要类型。 System.Text.Json.Serialization 命名空间包含用于高级方案的特性和 API,以及特定于序列化和反序列化的自定义
            */
            Console.WriteLine("测试将类序列号为json字符串....");
            TestClass test = new TestClass()
            {
                Id = 25,
                MyName = "张三",
                Summary = "abcd",
                CurrentTime = DateTime.Now
            };
            string jsonResult = JsonSerializer.Serialize(test,
                new JsonSerializerOptions()
                {
                    //中日韩统一表意文字(CJK Unified Ideographs) CJK (Chinese Japanese Korean) 汉字。CJK 是《GB2312-80》、《BIG5》等字符集的超集
                    Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.BasicLatin, System.Text.Unicode.UnicodeRanges.CjkUnifiedIdeographs),
                    WriteIndented = true //打印空格字符对齐
                });
            Console.WriteLine(jsonResult);
            Console.WriteLine("测试将json字符串转换为指定的对象...");
            string jsonString = @"[{""PlayerId"":15,""PlayerName"":""柷敔"",""Address"":""天晴之海""},{""PlayerId"":22,""playerName"":""越今朝"",""WEAPON"":""双剑""}]";
            try
            {                
                List<Role> list1 = JsonSerializer.Deserialize<List<Role>>(jsonString,
                    new JsonSerializerOptions()
                    {
                        //忽略大小写,如果不设置,默认区分大小写
                        PropertyNameCaseInsensitive = true
                    });
                list1.ForEach(role => Console.WriteLine($"编号:{role.PlayerId},姓名:{role.PlayerName},地址:{role.Address},武器:{role.Weapon}"));
                jsonString = @"[{""PlayerId"":15,""PlayerName"":""柷敔"",""Address"":""天晴之海""},{""PlayerId"":""22"",""playerName"":""越今朝"",""Weapon"":""双剑""}]";
                Role[] list2 = JsonSerializer.Deserialize<Role[]>(jsonString,
                    new JsonSerializerOptions()
                    {
                        //忽略大小写
                        PropertyNameCaseInsensitive = true
                    });
                foreach (Role role in list2)
                {
                    Console.WriteLine($"编号:{role.PlayerId},姓名:{role.PlayerName},地址:{role.Address},武器:{role.Weapon}");
                }
            }
            catch (Exception ex) 
            {
                Console.WriteLine("json转换时出现异常:" + ex.Message);
            }
            Console.WriteLine("测试特殊日期时间格式的json转换...");
            TestSpecialDateTimeConverter();
            Console.ReadLine();
        }

        /// <summary>
        /// 对于特殊日期时间格式的json转换
        /// 参考文档:https://docs.microsoft.com/zh-cn/dotnet/standard/datetime/system-text-json-support
        /// </summary>
        static void TestSpecialDateTimeConverter() 
        {
            // Parsing non-compliant format as DateTime fails by default.
            try
            {
                //使用默认的转换器 转化日期时间 失败
                DateTime dt = JsonSerializer.Deserialize<DateTime>(@"""Thu, 25 Jul 2019 13:36:07 GMT""");
                Console.WriteLine(dt);
            }
            catch (JsonException e)
            {
                Console.WriteLine(e.Message);
            }

            // Using converters gives you control over the serializers parsing and formatting.
            //使用自定义转化器;
            JsonSerializerOptions options = new JsonSerializerOptions();
            options.Converters.Add(new DateTimeConverterForCustomStandardFormatR());

            string testDateTimeStr = "Thu, 25 Jul 2019 13:36:07 GMT";
            string testDateTimeJson = @"""" + testDateTimeStr + @"""";

            DateTime resultDateTime = JsonSerializer.Deserialize<DateTime>(testDateTimeJson, options);
            Console.WriteLine(resultDateTime);

            Console.WriteLine(JsonSerializer.Serialize(DateTime.Parse(testDateTimeStr), options));
        }
    }

    /*
     * 使用 Utf8Parser 和 Utf8Formatter
如果输入 DateTime 或 DateTimeOffset 文本表示形式符合 "R"、"l"、"O"、"G" 标准日期和时间格式字符串中的一个或 "G"标准日期和时间格式字符串,或者需要根据这些格式中的一种进行写入,则可以在转换器逻辑中使用快速的基于 utf-8 的分析和格式设置方法。 
这比使用 DateTime(Offset).Parse 和 DateTime(Offset).ToString快得多。
此示例演示一个自定义转换器,该转换器根据"R" 标准格式对 DateTime 值进行序列化和反序列化
    */
    /// <summary>
    /// 自定义转换器。需实现抽象类JsonConverter&lt;T&gt;的抽象方法Read和Write
    /// </summary>
    public class DateTimeConverterForCustomStandardFormatR : JsonConverter<DateTime>
    {
        public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            System.Diagnostics.Debug.Assert(typeToConvert == typeof(DateTime));
            if (System.Buffers.Text.Utf8Parser.TryParse(reader.ValueSpan, out DateTime value, out _, 'R'))
            {
                return value;
            }

            throw new FormatException();
        }

        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
        {
            // The "R" standard format will always be 29 bytes.
            Span<byte> utf8Date = new byte[29];

            bool result = System.Buffers.Text.Utf8Formatter.TryFormat(value, utf8Date, out _, new System.Buffers.StandardFormat('R'));
            System.Diagnostics.Debug.Assert(result);

            writer.WriteStringValue(utf8Date);
        }
    }

    /// <summary>
    /// 角色
    /// </summary>
    class Role 
    {
        /// <summary>
        /// 编号
        /// </summary>
        public int PlayerId { get; set; }
        /// <summary>
        /// 姓名
        /// </summary>
        public string PlayerName { get; set; }
        /// <summary>
        /// 地址
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// 地址
        /// </summary>
        public string Weapon { get; set; }
    }

    /// <summary>
    /// 测试类
    /// </summary>
    class TestClass
    {
        public int Id { get; set; }
        public string MyName { get; set; }
        /// <summary>
        /// 可以被忽略的属性
        /// </summary>
        [JsonIgnore]
        public string Summary { get; set; }
        /// <summary>
        /// 当前时间
        /// </summary>
        public DateTime CurrentTime { get; set; }
    }
}
程序运行如图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net Core Json序列化和反序列化以及自定义JsonConverter来转化特殊日期时间格式 的相关文章

  • 如何在 Ubuntu 20.04 上安装 Dotnet Core

    NET Core 是一个免费的开源软件框架 其设计时考虑了 Linux 和 macOS 它是 NET Framework 的跨平台继承者 适用于 Linux macOS 和 Windows 系统 NET Core 框架已经提供了用于引导项目
  • 如何在 Ubuntu 22.04 上安装 .NET Core (dotnet)

    微软 NET核心是一个免费的开源软件框架 设计时考虑了 Linux 和 macOS 它是 NET Framework 的跨平台继承者 可用于 Linux macOS 和 Windows 系统 NET Core 6 是一个 LTR 版本 将在
  • .NET Core代码保护!.NET Reactor这些保护机制你不得不知道!

    NET Reactor是一个功能强大的代码保护和软件许可系统 适用于为 NET Framework编写的软件 并支持生成 NET程序集的所有语言 NET Reactor迎来了久违的版本更新 进入v6 3 0 0全新时代 支持Blazor保护
  • C# 计算两个日期之间的所有日期

    用一个for循环就可以解决 int year Begin Convert ToInt32 this dateBegin Value ToString yyyy int month Begin Convert ToInt32 this dat
  • net core 建立webservice项目

    1 创建项目 2 通过NuGet安装SoapCore 3 创建服务接口及实现类 本项目会创建2个webservice服务文件用于测试 所以创建了2个model类和2个接口文件 Model类 DataContract public class
  • 手把手教你搭建使用NuGet私有源

    文章目录 前言 Who 什么是NuGet Why 为什么用NuGet How 怎么使用NuGet 搭建Nuget私有源 打包Nuget包 发布到私有源 不开启密钥验证 开启密钥验证 测试 总结 前言 相信写过 net的小伙伴应该都用过NuG
  • 记录一次Nginx转发请求给Ocelot网关响应500错误排查

    先说明下我们的Http请求流转及系统部署方式 当Http请求发起时 会先到达Nginx 然后Nignx会将请求转发至Ocelot网关服务 Ocelot网关服务会再将请求转发给下游真实提供API服务的应用 我们的应用是基于Net Core 3
  • .NET Core使用EF Core框架

    文章目录 概述 安装EF Core 使用EF Core增删改查 单表查询 插入数据 修改数据 删除数据 概述 Entity Framework EF Core 是轻量化 可扩展 开源和跨平台版的常用 Entity Framework 数据访
  • .Net Core下简单的JWT黑名单中间件

    自从JWT认证方式在互联网上蔓延后 Session认证方式就被挤掉了一大半的生存空间 这里我们不讲JWT与Session两种方式的优缺点 我们只讲如何通过JWT的黑名单来阻止某些Token的登录 设置黑名单 也就是说要将Token写入某个存
  • centso7 openssl 报错Verify return code: 20 (unable to get local issuer certificate)

    问题重现 由于centos7 默认的openssl的版本为1 1 0k 本人编译媒体服务时 需要openssl版本1 1 1以上 所有删除的之前的低版本openssl 手动编译了一个1 1 1k的版本 媒体服务正常运行 并且CA验证正常 结
  • 【Freesql】实现动态分组(groupby)

    应用场景 分组条件是a b c d的任意组合 来自前端 前端选了 a就只分组a 选了 a b就分组a b 请问怎么用freesql写出来 select 部分也是来自前端 前端选了 a就只查a 选了 a b就只查a b select a b
  • Net Core API跨域的处理 vs2017

    Startup ConfigureServices public void ConfigureServices IServiceCollection services services AddCors options gt options
  • .net core 连接Mysql

    1 安装依赖包 在这里插入图片描述 https img blog csdnimg cn 16e74e954c414688b26af8b9d92fd793 png x oss process image watermark type d3F5
  • .Net Core跨域处理

    查看官方文档 https docs microsoft com zh cn aspnet core security cors view aspnetcore 2 2 分两部分处理跨域 ConfigureServices里添加 servic
  • .NET Core API框架实战(五) 依赖注入 服务的注册与提供

    ASP NET Core 的底层设计支持和使用依赖注入 ASP NET Core 应用程序可以利用内置的框架服务将它们注入到启动类Startup的方法中 并且应用程序服务ConfigureServices能够配置注入 依赖注入 Depend
  • 用VS Code创建ASP.NET Core Web API项目:TodoWebApi。(默认空项目,不与数据库交互)

    目录 一 使用VS Code终端创建一个 Net Core Web API项目 二 使用VS Code添加相关的NuGet程序集 2 1 方式一 使用 VS Code 终端的 dotnet 命令添加相关的NuGet程序集 2 2 方式二 使
  • 简述关于ASP.NET MVC与.NET CORE 的区别

    简述关于ASP NET MVC与 NET CORE的区别 1 关于ASP NET 关于MVC 刚开始接触这个技术的时候我经常不理解他们的名字 我相信许多学ASP NET开发人员开始接触MVC应该也和我一样产生很多为什么 也会误认为认为MVC
  • Nacos 单机模式部署(Windows系统)

    Nacos 下载地址 Nacos 是阿里巴巴推出来的一个项目 这是一个更易于构建云原生应用的动态服务发现 配置管理和服务管理平台 Nacos 致力于帮助您发现 配置和管理微服务 Nacos 提供了一组简单易用的特性集 帮助您快速实现动态服务
  • .Net项目github接入sonarcloud

    代码质量方面的检测工具 在这之前从来没用过 就算前阵子听说了sonarcloud 也仅当知道记录了下 结果昨天被某些事情刺激了下 于是去查了下资料 然后就顺便在github上做了下测试 这里做个记录 sonarcloud的官网地址是http
  • .NET Core 下定时任务调度

    一 增加本地json持久化调度任务 无需数据库 1 首先 我们创建一个空白的ASP NET Core 项目 MVC Razor和WebAPI都行 如图 2 通过nuget引用最新版本的GZY Quartz MUI组件 如图 组件的项目地址G

随机推荐

  • apt、apt-get、apt-cache使用详解

    文章目录 1 概述 2 搜索软件 查看软件信息 依赖关系 3 查看已安装软件 4 安装 升级软件 5 删除 6 清理 检查 7 忽略更新 8 apt get参数 9 参考文档 1 概述 apt apt get apt cache是三个软件
  • js修改数组中对象的key值

    不删除旧的key和value var data name 路口1 count 30 name 路口2 count 20 name 路口3 count 10 data data map item gt item value item coun
  • vue-router传参的四种方式超详细

    vue路由传参的四种方式 一 router link路由导航方式传参 父组件
  • 微服务优点缺点

    微服务架构采用Scale Cube方法设计应用架构 将应用服务按功能拆分成一组相互协作的服务 每个服务负责一组特定 相关的功能 每个服务可以有自己独立的数据库 从而保证与其他服务解耦 耦合是指两个或两个以上的体系或两种运动形式间通过相互作用
  • 移动端按设计图1:1布局方法

    1 为什么要写这篇教程 移动端布局大多数前端工程师使用的是百分比布局 然而百分比布局造成了很多问题 比如图片在不同分辨率下会有变形的问题 高度需要按照分辨率去兼容适配等等 今天给大家分享的这种布局方式 可以摈弃百分比布局 直接根据设计图1
  • 管道符和xargs

    先看一个例子 今天上了一门Linux课 其中有一道题是这样的 将文件 lib 目录下所有以包含 so的文件复制到cmd test目录下 一开始看到这个题 想法是先用find命令找出包含 so的文件 然后使用管道符cp 如下 find lib
  • robotstudio要从当前占位符中提取IRB2600....

    如上图所示 在添加singal后重启控制器便出现了这样的提示 找了一圈也没有找到答案 希望有高人指点指点
  • 关于8266WiFi模块(AT)问题分析与解答(单片机和wifi模块连接)

    近段时间由于作品需要 就入手了一个esp 01 s 8266wifi模块 厂家已经刷好固件 这个模块使用起来还是很简单便捷的 但是在调试过程中会遇到各种问题 以下是个人的一个总结 希望对大家有帮助 1 单片机晶振和波特率问题 重要 有关单片
  • 基于预测控制模型的自适应巡航控制仿真与机器人实现(Matlab代码实现)

    目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 1 概述 自适应巡航控制技术为目前由于汽车保有量不断增长而带来的行车安全 驾驶舒适性及交通拥堵等问题提供了一条有效的解决途径 因此本文通过理论分析 仿真验证及实车实验对自适应
  • 使用editor.md渲染markdown并自定义目录

    使用editor md渲染markdown并自定义目录 一 需求 最近在开发个人博客 在做文章详情页的时候 需要将markdown格式的文本字符串渲染成html页面 于是逛github的时候发现了这一款markdown在线编辑器 它支持将m
  • Json“牵手”亚马逊商品详情数据方法,亚马逊商品详情API接口,亚马逊API申请指南

    亚马逊平台是美国最大的一家网络电子商务公司 亚马逊公司是1995年成立 刚开始只做网上书籍售卖业务 后来扩展到了其他产品 现在已经是全世界商品品种最多的网上零售商和第二互联网公司 亚马逊是北美洲 欧洲等地区的主流购物平台 亚马逊商品分类接口
  • Office Visio 2007安装教程

    哈喽 大家好 今天一起学习的是Visio 2007的安装 这是一个绘制流程图的软件 用有效的绘图表达信息 比任何文字都更加形象和直观 Office Visio 是office软件系列中负责绘制流程图和示意图的软件 便于IT和商务人员就复杂信
  • SpringCloud与Dubbo的比较

    目录 Dubbo 一 dubbo简介 二 dubbo组织架构图 三 dubbo的优势 SpringCloud 一 SpringCloud简介 二 SpringCloud组织架构 三 SpringCloud特点 四 Dubbo与SpringC
  • 共模电感(扼流圈)选型

    1 共模电感原理 在介绍共模电感之前先介绍扼流圈 扼流圈是一种用来减弱电路里面高频电流的低阻抗线圈 为了提高其电感扼流圈通常有一软磁材料制的核心 共模扼流圈有多个同样的线圈 电流在这些线圈里反向流 因此在扼流圈的芯里磁场抵消 共模扼流圈常被
  • Python:打包生成.pyc、.pyd文件

    目录 pyd文件是什么 1 环境 2 待编译文件hello py以及setup py文件 3 运行调试 4 写在最后 pyd文件是什么 pyd文件类似于DLL 一般用C C 语言编译而成 可用作模块导入Python程序中 pyd文件仅适用于
  • 使用Unity游戏引擎在IOS模拟器中运行的方法

    在Unity编译IOS程序时 在Unity导航栏菜单中选择Edit gt ProjectSettings gt Player 菜单项 选择IOS平台在下方SDK Version处选择运行设备为IOS模拟器 选择完毕后Build and Ru
  • 任意代码执行漏洞简介

    一 任意代码执行漏洞思维导图 代码执行漏洞的成因 应用程序在调用一些能够将字符串转换为代码的函数 例如php中的eval中 没有考虑用户是否控制这个字符串 将造成代码执行漏洞 代码执行漏洞的常用函数 PHP eval assert preg
  • springcloud整合Hystrix

    作用 1 服务降级 触发情况 程序运行异常 超时 服务熔断触发服务降级 线程池 信号量打满也会触发服务降级 2 服务熔断 直接拒绝访问 即使有正确的访问也会短路 3 服务限流 排队有序进行 构建服务 1 建module provider h
  • 希沃白板5使用方法

    一 获取白板 手机和电脑都下载希沃白板五5 二 使用白板制作课件 1 获取课件 制作课件 方法一 1 点击课件库 2 点击右上角齿轮完成教材选择 3 找到所需课件 4 点击右下角箭头翻看 觉得可以点击 限免获取 5 点击云课件 找到刚才获取
  • .Net Core Json序列化和反序列化以及自定义JsonConverter来转化特殊日期时间格式

    System Text Json 命名空间提供用于序列化和反序列化 JavaScript 对象表示法 JSON 的功能 System Text Json 命名空间包含所有入口点和主要类型 System Text Json Serializa