You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
4.1 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Unicode;
using System.Threading.Tasks;
namespace Estsh.Core.Quartz.Model
{
public class JsonDataResult : JsonResult
{
public JsonDataResult(object values,object option):base(values,
option)
{
}
public override void ExecuteResult(ActionContext context)
{
var services = context.HttpContext.RequestServices;
var executor = services.GetRequiredService<IActionResultExecutor<JsonResult>>();
var typename = executor.GetType().FullName;
if (typename.Equals("Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor"))
{
this.SerializerSettings = new System.Text.Json.JsonSerializerOptions()
{
PropertyNamingPolicy = null,
WriteIndented = true,
Converters = { new DateTimeJsonConverter() },
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(UnicodeRanges.All)
};
}
if (typename.Equals("Microsoft.AspNetCore.Mvc.NewtonsoftJson.NewtonsoftJsonResultExecutor"))
{
this.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings()
{
DateFormatString = "yyyy-MM-dd HH:mm:ss",
ContractResolver = null,
DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local,
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
};
}
base.ExecuteResult(context);
}
public override Task ExecuteResultAsync(ActionContext context)
{
var services = context.HttpContext.RequestServices;
var executor = services.GetRequiredService<IActionResultExecutor<JsonResult>>();
var typename = executor.GetType().FullName;
if (typename.Equals("Microsoft.AspNetCore.Mvc.Infrastructure.SystemTextJsonResultExecutor"))
{
this.SerializerSettings = new System.Text.Json.JsonSerializerOptions()
{
PropertyNamingPolicy = null,
WriteIndented = true,
Converters = { new DateTimeJsonConverter() },
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(UnicodeRanges.All)
};
}
if (typename.Equals("Microsoft.AspNetCore.Mvc.NewtonsoftJson.NewtonsoftJsonResultExecutor"))
{
this.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings()
{
DateFormatString = "yyyy-MM-dd HH:mm:ss",
ContractResolver = null,
DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local,
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize
};
}
return base.ExecuteResultAsync(context);
}
public JsonDataResult(object values) : base(values)
{
}
}
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.ToString(_dateFormatString));
}
}
}