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; }
    }
}
程序运行如图:

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

  1. 一文读懂Json序列化与反序列化

    一文读懂Json序列化与反序列化 一文读懂Json序列化与反序列化 #mermaid-svg-tVjnnlFu6ZBDpGOQ {font-family:"trebuchet ms" ...

  2. DotNet的JSON序列化与反序列化

    JSON(JavaScript Object Notation)JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.在现在的通信中,较多的采用JSON数据格式,JSON有 ...

  3. Go进阶(7): JSON 序列化和反序列化

    1. json序列化和反序列化基础 json数据的序列化和反序列化是一种非常常见的方式,尤其是在http/rcp的微服务调试中. 基础语法 在 Go 中我们主要使用官方的 encoding/json  ...

  4. JavaScript JSON序列化和反序列化

    文章目录 JavaScript JSON序列化和反序列化 概述 JSON序列化 JSON.stringify() 仅一个参数使用 使用2个参数 使用3个参数 其他 自定义toJson 序列化顺序 反序 ...

  5. JAVA中JSON序列化和反序列化

    JAVA中JSON序列化和反序列化 1 FASTJSON的序列化和反序列化 1.1 主函数 1.2 自定义对象 2 GSON序列化和反序列化 2.1 主函数 2.2 自定义对象 总结 不同包序列化和反 ...

  6. LocalDateTime的JSON序列化和反序列化

    jackson的json中Date的序列化和反序列化 import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jac ...

  7. JSON序列化和反序列化还有这种玩法

    Mixin对于前端开发者可不陌生,Vue.React等知名前端框架都使用了Mixin.而对于后端开发,尤其是Java后端开发来说Mixin却是一个很陌生的概念.今天来我们通过Jackson让后端开发者 ...

  8. C#中JSON序列化和反序列化

    有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境-- 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...

  9. json 反序列化 父子类型_Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo...

    Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...

最新文章

  1. Windows Server vNext Technical Preview UI Build 9841
  2. mybatis使用find_in_set导致cpu占用过高
  3. [云炬创业基础笔记]第五章创业机会评估测试11
  4. Kettle使用_8 存储过程结合获取系统信息
  5. 企业使用RTX腾讯通2013
  6. Axial symmetry FZU - 2035
  7. uva 10118 ——Free Candies
  8. Java泛型初探————泛型通配
  9. linux讲日志暂停,linux – Rsyslog在日志轮换后停止向远程服务器发送数据
  10. Python-cvxopt库的使用(1)(解决LP问题)
  11. 【Java从0到架构师】SSM 整合(XML、纯注解)
  12. ue4集合类型_UE4.22 Subsystem分析
  13. Android自定义View里面获取宽高及dp和px间的转换
  14. 多变量时间序列相似度量
  15. 网鼎杯2020 玄武组部分writeup
  16. 面试真题纠错(京东、爱奇艺)
  17. H5网页涂鸦canvas
  18. python3.7 安装 scrapy, pip 升级
  19. 2022跨年烟花代码(四)HTML5全屏烟花动画特效
  20. k8s二进制安装-3,配置ca证书

热门文章

  1. VMware是一个非常好的虚拟机软件
  2. springboot 2 application配置
  3. 两个PDF比较标出差异_轻松搞定PDF格式转换
  4. 考试用计算机反思800字,考后反思作文800字
  5. android 单例模式的使用场景,Android设计模式—单例模式
  6. MYSQL语句汇总 转载
  7. 聚焦丨看泛建材巨头如何实现数字化改造,推动企业业务增长
  8. 2018.10.1(这不仅是一篇日记,也是mac使用心得整理,未完待续……)
  9. 数据结构一 线性结构和非线性结构
  10. python 字典 遍历字典元素