namespace XFEExtension.NetCore.XFETransform.Json;
///
/// JSON 属性名称的输出策略。
///
public enum XFEJsonPropertyNamingPolicy
{
///
/// 保持 CLR 成员名称不变。
///
Unchanged,
///
/// 将 CLR 成员名称的首字母转换为小写。
///
CamelCase
}
///
/// 反序列化遇到未映射成员时的处理方式。
///
public enum XFEJsonUnmappedMemberHandling
{
///
/// 忽略未映射成员。
///
Ignore,
///
/// 将未映射成员视为错误。
///
Error
}
///
/// 枚举的 JSON 输出格式。
///
public enum XFEJsonEnumFormat
{
///
/// 输出枚举的底层数值。
///
Number,
///
/// 输出枚举成员名称。
///
String
}
///
/// XFE JSON 编解码选项。实例在传入操作时会被复制,后续修改不会影响正在执行的操作。
///
public sealed class XFEJsonOptions
{
///
/// 默认选项。
///
public static XFEJsonOptions Default { get; } = new();
///
/// 最大 JSON 嵌套深度。
///
public int MaxDepth { get; init; } = 128;
///
/// POCO 成员绑定是否忽略属性名称大小写。
///
public bool PropertyNameCaseInsensitive { get; init; } = true;
///
/// CLR 成员名称的 JSON 输出策略。
///
public XFEJsonPropertyNamingPolicy PropertyNamingPolicy { get; init; } = XFEJsonPropertyNamingPolicy.Unchanged;
///
/// 是否包含公开字段。
///
public bool IncludeFields { get; init; }
///
/// 未映射 JSON 成员的处理方式。
///
public XFEJsonUnmappedMemberHandling UnmappedMemberHandling { get; init; } = XFEJsonUnmappedMemberHandling.Ignore;
///
/// 枚举的输出格式。
///
public XFEJsonEnumFormat EnumFormat { get; init; } = XFEJsonEnumFormat.Number;
///
/// 是否格式化 JSON 输出。
///
public bool WriteIndented { get; init; }
}
internal readonly record struct JsonSettings(
int MaxDepth,
bool PropertyNameCaseInsensitive,
XFEJsonPropertyNamingPolicy PropertyNamingPolicy,
bool IncludeFields,
XFEJsonUnmappedMemberHandling UnmappedMemberHandling,
XFEJsonEnumFormat EnumFormat,
bool WriteIndented)
{
public static JsonSettings Create(XFEJsonOptions? options)
{
options ??= XFEJsonOptions.Default;
if (options.MaxDepth is < 1 or > 2048)
throw new ArgumentOutOfRangeException(nameof(options), options.MaxDepth, "MaxDepth 必须在 1 到 2048 之间。");
return new(
options.MaxDepth,
options.PropertyNameCaseInsensitive,
options.PropertyNamingPolicy,
options.IncludeFields,
options.UnmappedMemberHandling,
options.EnumFormat,
options.WriteIndented);
}
public XFEJsonOptions ToOptions() => new()
{
MaxDepth = MaxDepth,
PropertyNameCaseInsensitive = PropertyNameCaseInsensitive,
PropertyNamingPolicy = PropertyNamingPolicy,
IncludeFields = IncludeFields,
UnmappedMemberHandling = UnmappedMemberHandling,
EnumFormat = EnumFormat,
WriteIndented = WriteIndented
};
}