System.Test.Json 转换

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);
    }
    
原文地址:https://www.cnblogs.com/qs315/p/13569584.html