• System.Test.Json 轉換

    System.Test.Json 轉換

    青杉 646 2021-11-17

    datetime空值轉換

    • 創建轉換器 DateTimeNullJsonConvert.cs
      /// <summary>
      /// datetime 空值轉換
      /// </summary>
      public class DateTimeNullJsonConvert : JsonConverter<Nullable<DateTime>>
      {
          /// <summary>
          /// 讀取
          /// </summary>
          /// <param name="reader"></param>
          /// <param name="typeToConvert"></param>
          /// <param name="options"></param>
          /// <returns></returns>
          public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
          {
              if (reader.TokenType == JsonTokenType.Null)
              {
                  return default;
              }
              if (reader.TokenType == JsonTokenType.String)
              {
                  if (DateTime.TryParse(reader.GetString(), out DateTime date))
                  {
                      return date;
                  }
                  return default;
              }
              return reader.GetDateTime();
          }
          /// <summary>
          /// 輸出
          /// </summary>
          /// <param name="writer"></param>
          /// <param name="value"></param>
          /// <param name="options"></param>
          public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options)
          {
              writer.WriteStringValue(value == null ? "" : value.Value.ToString("yyyy-MM-dd HH:mm:ss"));
          }
      }
      
    • 在Setup.cs 配置文件AddJsonOptions中加入
      services.AddControllers().AddJsonOptions(opt =>
      {
          //修復日期空值返回異常
          opt.JsonSerializerOptions.Converters.Add(new DateTimeNullJsonConvert());
      })
      

    循環引用

    例如目錄結構需要循環引用本身 而 System.Test.Json 不允許套嵌引用過多 可使用以下方案解決

    • 方案一
      • 使用Newtonsoft.JsonStartUp.cs中添加
      services.AddControllers().AddNewtonsoftJson();
      
    • 方案二
      • 如果當前項目必須使用System.Test.Json那就將需要進行循環引用的數據進行單獨轉換 單獨使用Newtonsoft.Json
        例如
      public IActionResult Index(){
          var res = new NodeTree();
          var str = Newtonsoft.Json.JsonConvert.SerializeObject(res);
          return Json(str);
      }
      


    国产一级A级高清毛片