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

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

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);
        }
    }
}

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

更多相關文章
  • 一、下載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: 可以創建自定義篩選器,用於處理橫切關註點。 橫切關註點的示例包括錯誤處理、緩存、配置、授權和日誌記錄。 篩選器可以避免複製代碼。 例如,錯誤處理異常篩選器可以 ...
一周排行
  • 背景 當我們對ASP.Net Core內部的某些方法、類的實現感興趣時,有很多方法可以去瞭解,看書,看各種文章,但是最直接也是最深入的辦法就是去閱讀源代碼。ASP.NET Core的源代碼托管在Github,項目地址是:https://github.com/dotnet/aspnetcore。如果只 ...
  • 1. 前言 Xceed wpftoolkit提供了一個 "CheckListBox" ,效果如下: 不過它用起來不怎麼樣,與其這樣還不如參考UWP的ListView實現,而且動畫效果也很好看: 它的樣式如下: 屬性是很多了,但這裡沒有自定義CheckBox樣式的方法,而且也沒法參考它的動畫如何實現。 ...
  • 定義委托 委托實例化 定義具體執行的方法 綁定方法 觸發委托 ...
  • 文章出處: https://www.cnblogs.com/dotnet261010/p/6275821.html 一、WPF簡介 WPF:WPF即Windows Presentation Foundation,翻譯為中文“Windows呈現基礎”,是微軟推出的基於Windows Vista的用戶界 ...
  • 前言 IdentityServer4(以下簡稱 Id4) 是 Asp.Net Core 中一個非常流行的 OpenId Connect 和 OAuth 2.0 框架,可以輕鬆集成到 Asp.Net Core 應用中,並且與 Asp.Net Core Identity 也可以輕鬆集成。博客園也有大佬發 ...
  • //從第1個開始,依次向左插入值。如果鍵不存在,先創建再插入值 隊列形式 先進後出,後進先出 //插入後形式 <-- 10,9,8,7,6,5,4,3,2,1 <-- 方向向左依次進行 stopwatch.Start(); for (int i = 0; i < 10; i++) { var get ...
  • 過濾漢字 Regex.Replace(inputStr,@"[\u4e00-\u9fa5]",string.Empty); 提取漢字: Regex.Replace(inputStr,@"[^\u4e00-\u9fa5]",string.Empty);//註意這裡多了個^符號 ...
  • String類型很簡單,就不做示例演示了,這裡只貼出Helper類 /// <summary> /// 判斷key是否存在 /// </summary> /// <param name="key"></param> /// <param name="db"></param> /// <returns ...
  • 通過上一章的學習,Geometry抽象類表示形狀或路徑。Drawing抽象類扮演了互補的角色,它表示2D圖畫(Drawing)——換句話說,它包含了顯示矢量圖像或點陣圖需要的所有信息。 儘管有幾類畫圖類,但只有GeometryDrawing類能使用已經學習過的幾何圖形。它增加了決定如何繪製圖形的畫筆和 ...
  • 以控台的形式,運行.net core mvc 代碼, Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>();//指定網路主機要使用的啟動類型 ...
x