// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Admin.NET.Core;
///
/// 自定义JSON转换器
///
///
/// 自定义JSON转换器工厂类
///
public class CustomJsonConverter : JsonConverterFactory
{
///
/// 判断是否可以转换指定类型
///
/// 要转换的类型
/// 是否可以转换
public override bool CanConvert(Type typeToConvert)
{
return typeToConvert.GetProperties()
.Any(p => p.GetCustomAttribute() != null);
}
///
/// 创建指定类型的转换器实例
///
/// 要转换的类型
/// JSON序列化选项
/// JSON转换器实例
public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options)
{
var converterType = typeof(CustomConverter<>).MakeGenericType(type);
return (JsonConverter)Activator.CreateInstance(converterType, options);
}
///
/// 自定义转换器实现类
///
/// 要转换的类型
private class CustomConverter : JsonConverter
{
///
/// 基础JSON序列化选项
///
private readonly JsonSerializerOptions _baseOptions;
///
/// JSON属性名到对象属性的映射字典
///
private readonly Dictionary _jsonToPropertyMap;
///
/// 构造函数
///
/// 基础JSON序列化选项
public CustomConverter(JsonSerializerOptions baseOptions)
{
_baseOptions = new JsonSerializerOptions(baseOptions);
_jsonToPropertyMap = CreatePropertyMap();
}
///
/// 创建属性映射字典
///
/// 属性映射字典
private Dictionary CreatePropertyMap()
{
var map = new Dictionary(StringComparer.OrdinalIgnoreCase);
foreach (var prop in typeof(T).GetProperties())
{
var customAttr = prop.GetCustomAttribute();
if (customAttr != null)
{
map[customAttr.Name] = prop;
}
else
{
var jsonName = _baseOptions.PropertyNamingPolicy?.ConvertName(prop.Name) ?? prop.Name;
map[jsonName] = prop;
}
}
return map;
}
///
/// 反序列化JSON为对象
///
/// JSON读取器
/// 要转换的类型
/// JSON序列化选项
/// 反序列化后的对象
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.Null) return default;
// 创建实例并设置默认值
var instance = Activator.CreateInstance();
object GetDefaultValue(Type type) => type.IsValueType ? Activator.CreateInstance(type) : null;
foreach (var prop in typeof(T).GetProperties().Where(p => p.CanWrite))
prop.SetValue(instance, GetDefaultValue(prop.PropertyType));
while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
{
if (reader.TokenType == JsonTokenType.PropertyName)
{
var propertyName = reader.GetString();
if (_jsonToPropertyMap.TryGetValue(propertyName, out var prop))
{
reader.Read();
var value = JsonSerializer.Deserialize(ref reader, prop.PropertyType, _baseOptions);
prop.SetValue(instance, value);
}
else
{
reader.Skip();
}
}
}
return instance;
}
///
/// 序列化对象为JSON
///
/// JSON写入器
/// 要序列化的对象
/// JSON序列化选项
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
writer.WriteStartObject();
foreach (var prop in typeof(T).GetProperties())
{
var propValue = prop.GetValue(value);
if (propValue == null && _baseOptions.DefaultIgnoreCondition == JsonIgnoreCondition.WhenWritingNull)
continue;
var customAttr = prop.GetCustomAttribute();
var jsonName = customAttr?.Name ?? _baseOptions.PropertyNamingPolicy?.ConvertName(prop.Name) ?? prop.Name;
writer.WritePropertyName(jsonName);
JsonSerializer.Serialize(writer, propValue, prop.PropertyType, _baseOptions);
}
writer.WriteEndObject();
}
}
}