System.Text.Json 自定義Converter實現時間轉換

来源:https://www.cnblogs.com/WNpursue/archive/2020/01/22/12227929.html
-Advertisement-
Play Games

Newtonsoft.Json與System.Text.Json區別 在 Newtonsoft.Json中可以使用例如 方式設置接收/序列化時間格式,但在.net core 3.1中System.Text.Json是沒有自帶方式進行轉換,這就需要自定義Converter實現時間轉換 "官方GitHu ...


Newtonsoft.Json與System.Text.Json區別

在 Newtonsoft.Json中可以使用例如
.AddJsonOptions(options =>
                {
                    options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
                })

方式設置接收/序列化時間格式,但在.net core 3.1中System.Text.Json是沒有自帶方式進行轉換,這就需要自定義Converter實現時間轉換
官方GitHub地址

自定義DateTimeJsonConverter

    public class DateTimeJsonConverter : JsonConverter<DateTime>
    {
        private readonly string _dateFormatString;
        public DateTimeJsonConverter()
        {
            _dateFormatString = "yyyy-MM-dd HH:mm:ss";
        }

        public DateTimeJsonConverter(string dateFormatString)
        {
            _dateFormatString = dateFormatString;
        }

        public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            return DateTime.Parse(reader.GetString());
        }

        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToUniversalTime().ToString(_dateFormatString));
        }
    }

JsonTokenType枚舉類型共有以下幾種

  /// <summary>Defines the various JSON tokens that make up a JSON text.</summary>
  public enum JsonTokenType : byte
  {
    /// <summary>There is no value (as distinct from <see cref="F:System.Text.Json.JsonTokenType.Null" />).</summary>
    None,
    /// <summary>The token type is the start of a JSON object.</summary>
    StartObject,
    /// <summary>The token type is the end of a JSON object.</summary>
    EndObject,
    /// <summary>The token type is the start of a JSON array.</summary>
    StartArray,
    /// <summary>The token type is the end of a JSON array.</summary>
    EndArray,
    /// <summary>The token type is a JSON property name.</summary>
    PropertyName,
    /// <summary>The token type is a comment string.</summary>
    Comment,
    /// <summary>The token type is a JSON string.</summary>
    String,
    /// <summary>The token type is a JSON number.</summary>
    Number,
    /// <summary>The token type is the JSON literal true.</summary>
    True,
    /// <summary>The token type is the JSON literal false.</summary>
    False,
    /// <summary>The token type is the JSON literal null.</summary>
    Null,
  }

services.AddMvc 中 Newtonsoft.Json與System.Text.Json 配置區別

.netcore 2.1

            services
                //全局配置Json序列化處理
                .AddJsonOptions(options =>
                {
                    //忽略迴圈引用
                    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                    //不使用駝峰樣式的key
                    options.SerializerSettings.ContractResolver = new DefaultContractResolver();
                    //設置時間格式
                    options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
                })

.netcore 3.1

            services.AddControllers()
                .AddJsonOptions(options =>
                {
                    //設置時間格式
                    options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter("yyyy-MM-dd HH:mm:ss"));
                    //設置bool獲取格式
                    options.JsonSerializerOptions.Converters.Add(new BoolJsonConverter());
                    //不使用駝峰樣式的key
                    options.JsonSerializerOptions.PropertyNamingPolicy = null;
                    //不使用駝峰樣式的key
                    options.JsonSerializerOptions.DictionaryKeyPolicy = null;
                    //獲取或設置要在轉義字元串時使用的編碼器
                    options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
                });

bool型轉換問題

.netcore 3.1中接收的json中不能將 "true"/"false"識別為boolean的True/False,這也需要自定義Converter實現bool轉換

namespace Kdniao.Core.Utility
{
    public class BoolJsonConverter : JsonConverter<bool>
    {
        public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            if (reader.TokenType == JsonTokenType.True || reader.TokenType == JsonTokenType.False)
                return reader.GetBoolean();

            return bool.Parse(reader.GetString());
        }

        public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
        {
            writer.WriteBooleanValue(value);
        }
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、下載CMS源碼 https://www.yzmcms.com/xiazai 下載完成後得到一個這樣的壓縮包 接著下載PHPStudy,安裝只要一直點下一步就可以了 安裝完成後打開,如下圖啟動兩個地方 接著解壓一開始下載的那個PHPCMS壓縮包,把文件放到PHPStudy的制定目錄下,如下圖 最後 ...
  • SpringMVC 視圖解析 請求處理方法(controller方法)執行完成後,最終返回一個 ModelAndView 對象,即使出現異常也會返回一個 ModelAndView 對象。對於那些返回 String,View 或 ModeMap 等類型的處理方法,Spring MVC 也會在內部將它們 ...
  • 本隨筆中記載了博主在學習Python的字元串與編碼時,不太熟悉的內容。 ...
  • Python 官方文檔 PEP484(類型提示)的譯文,本人原創。 ...
  • 本隨筆中記載了博主在學習Python的變數與輸出時,不太熟悉的內容。 ...
  • 將自己定義的方法,變數存放在文件中,為一些腳本或者互動式的解釋器實例使用,這個文件稱為模塊。 細說的話,模塊可以分為四個通用類別: 1 使用python編寫的.py文件(自定義模塊) 2 已被編譯為共用庫或DLL的C或C++擴展 3 把一系列模塊組織到一起的文件夾(註:文件夾下有一個__init__ ...
  • MyBatis Generator(MBG)的使用 MBG可以根據數據表生成對應的model、xml映射文件、mapper介面,只是簡單的生成,還需要根據需求修改。 1、下載jar包 https://github.com/mybatis/generator/releases 解壓後有3個jar包,只 ...
  • AddControllers/AddMvc方法允許添加自定義ActionFilterAttribute進行過濾 文檔中這麼定義Filter: 可以創建自定義篩選器,用於處理橫切關註點。 橫切關註點的示例包括錯誤處理、緩存、配置、授權和日誌記錄。 篩選器可以避免複製代碼。 例如,錯誤處理異常篩選器可以 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...