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 }; }