using System.Linq; using Utf8Json.Formatters; using Utf8Json.Resolvers.Internal; namespace Utf8Json.Resolvers { public static class StandardResolver { /// AllowPrivate:False, ExcludeNull:False, NameMutate:Original public static readonly IJsonFormatterResolver Default = DefaultStandardResolver.Instance; /// AllowPrivate:False, ExcludeNull:False, NameMutate:CamelCase public static readonly IJsonFormatterResolver CamelCase = CamelCaseStandardResolver.Instance; /// AllowPrivate:False, ExcludeNull:False, NameMutate:SnakeCase public static readonly IJsonFormatterResolver SnakeCase = SnakeCaseStandardResolver.Instance; /// AllowPrivate:False, ExcludeNull:True, NameMutate:Original public static readonly IJsonFormatterResolver ExcludeNull = ExcludeNullStandardResolver.Instance; /// AllowPrivate:False, ExcludeNull:True, NameMutate:CamelCase public static readonly IJsonFormatterResolver ExcludeNullCamelCase = ExcludeNullCamelCaseStandardResolver.Instance; /// AllowPrivate:False, ExcludeNull:True, NameMutate:SnakeCase public static readonly IJsonFormatterResolver ExcludeNullSnakeCase = ExcludeNullSnakeCaseStandardResolver.Instance; /// AllowPrivate:True, ExcludeNull:False, NameMutate:Original public static readonly IJsonFormatterResolver AllowPrivate = AllowPrivateStandardResolver.Instance; /// AllowPrivate:True, ExcludeNull:False, NameMutate:CamelCase public static readonly IJsonFormatterResolver AllowPrivateCamelCase = AllowPrivateCamelCaseStandardResolver.Instance; /// AllowPrivate:True, ExcludeNull:False, NameMutate:SnakeCase public static readonly IJsonFormatterResolver AllowPrivateSnakeCase = AllowPrivateSnakeCaseStandardResolver.Instance; /// AllowPrivate:True, ExcludeNull:True, NameMutate:Original public static readonly IJsonFormatterResolver AllowPrivateExcludeNull = AllowPrivateExcludeNullStandardResolver.Instance; /// AllowPrivate:True, ExcludeNull:True, NameMutate:CamelCase public static readonly IJsonFormatterResolver AllowPrivateExcludeNullCamelCase = AllowPrivateExcludeNullCamelCaseStandardResolver.Instance; /// AllowPrivate:True, ExcludeNull:True, NameMutate:SnakeCase public static readonly IJsonFormatterResolver AllowPrivateExcludeNullSnakeCase = AllowPrivateExcludeNullSnakeCaseStandardResolver.Instance; } } namespace Utf8Json.Resolvers.Internal { internal static class StandardResolverHelper { internal static readonly IJsonFormatterResolver[] CompositeResolverBase = new[] { BuiltinResolver.Instance, // Builtin #if !NETSTANDARD Utf8Json.Unity.UnityResolver.Instance, #endif EnumResolver.Default, // Enum(default => string) DynamicGenericResolver.Instance, // T[], List, etc... AttributeFormatterResolver.Instance // [JsonFormatter] }; } internal sealed class DefaultStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new DefaultStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); DefaultStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.Default }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class CamelCaseStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new CamelCaseStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); CamelCaseStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.CamelCase }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class SnakeCaseStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new SnakeCaseStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); SnakeCaseStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.SnakeCase }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class ExcludeNullStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new ExcludeNullStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); ExcludeNullStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.ExcludeNull }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class ExcludeNullCamelCaseStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new ExcludeNullCamelCaseStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); ExcludeNullCamelCaseStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.ExcludeNullCamelCase }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class ExcludeNullSnakeCaseStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new ExcludeNullSnakeCaseStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); ExcludeNullSnakeCaseStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.ExcludeNullSnakeCase }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class AllowPrivateStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new AllowPrivateStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); AllowPrivateStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.AllowPrivate }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class AllowPrivateCamelCaseStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new AllowPrivateCamelCaseStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); AllowPrivateCamelCaseStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.AllowPrivateCamelCase }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class AllowPrivateSnakeCaseStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new AllowPrivateSnakeCaseStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); AllowPrivateSnakeCaseStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.AllowPrivateSnakeCase }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class AllowPrivateExcludeNullStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new AllowPrivateExcludeNullStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); AllowPrivateExcludeNullStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.AllowPrivateExcludeNull }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class AllowPrivateExcludeNullCamelCaseStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new AllowPrivateExcludeNullCamelCaseStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); AllowPrivateExcludeNullCamelCaseStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.AllowPrivateExcludeNullCamelCase }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } internal sealed class AllowPrivateExcludeNullSnakeCaseStandardResolver : IJsonFormatterResolver { // configure public static readonly IJsonFormatterResolver Instance = new AllowPrivateExcludeNullSnakeCaseStandardResolver(); static readonly IJsonFormatter fallbackFormatter = new DynamicObjectTypeFallbackFormatter(InnerResolver.Instance); AllowPrivateExcludeNullSnakeCaseStandardResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { if (typeof(T) == typeof(object)) { formatter = (IJsonFormatter)fallbackFormatter; } else { formatter = InnerResolver.Instance.GetFormatter(); } } } sealed class InnerResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new InnerResolver(); static readonly IJsonFormatterResolver[] resolvers = StandardResolverHelper.CompositeResolverBase.Concat(new[] { DynamicObjectResolver.AllowPrivateExcludeNullSnakeCase }).ToArray(); InnerResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { foreach (var item in resolvers) { var f = item.GetFormatter(); if (f != null) { formatter = f; return; } } } } } } }