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

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 list1 = JsonSerializer.Deserialize>(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(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();
        }

        ///


        /// 对于特殊日期时间格式的json转换
        /// 参考文档:https://docs.microsoft.com/zh-cn/dotnet/standard/datetime/system-text-json-support
        ///

        static void TestSpecialDateTimeConverter() 
        {
            // Parsing non-compliant format as DateTime fails by default.
            try
            {
                //使用默认的转换器 转化日期时间 失败
                DateTime dt = JsonSerializer.Deserialize(@"""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(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 值进行序列化和反序列化
    */
    ///


    /// 自定义转换器。需实现抽象类JsonConverter<T>的抽象方法Read和Write
    ///

    public class DateTimeConverterForCustomStandardFormatR : JsonConverter
    {
        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 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);
        }
    }

    ///


    /// 角色
    ///

    class Role 
    {
        ///
        /// 编号
        ///

        public int PlayerId { get; set; }
        ///
        /// 姓名
        ///

        public string PlayerName { get; set; }
        ///
        /// 地址
        ///

        public string Address { get; set; }
        ///
        /// 地址
        ///

        public string Weapon { get; set; }
    }

    ///


    /// 测试类
    ///

    class TestClass
    {
        public int Id { get; set; }
        public string MyName { get; set; }
        ///
        /// 可以被忽略的属性
        ///

        [JsonIgnore]
        public string Summary { get; set; }
        ///
        /// 当前时间
        ///

        public DateTime CurrentTime { get; set; }
    }
}
程序运行如图:

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

你可能感兴趣的:(.Net,Core)