Create a custom CompositeResolver
masterFor complex projects, it is recommended to build a custom IJsonFormatterResolver that implements a cache for formatters. This allows you to combine specific IJsonFormatter instances (like custom date formatters) with a chain of other resolvers (like ImmutableCollectionResolver or EnumResolver).
Alternatively, you can use CompositeResolver.Create to build a dynamic resolver at runtime. Note that CompositeResolver.Create has a high cost and cannot be garbage collected easily, so you should store the resulting instance in a static field.
// create custom composite resolver per project is recommended way.
public class ProjectDefaultResolver : IJsonFormatterResolver
{
public static IJsonFormatterResolver Instance = new ProjectDefaultResolver();
static IJsonFormatter[] formatters = new IJsonFormatter[]{
new DateTimeFormatter("yyyy-MM-dd HH:mm:ss"),
new NullableDateTimeFormatter("yyyy-MM-dd HH:mm:ss")
};
static readonly IJsonFormatterResolver[] resolvers = new[] {
ImmutableCollectionResolver.Instance,
EnumResolver.UnderlyingValue,
StandardResolver.AllowPrivateExcludeNullSnakeCase
};
// ... implementation of GetFormatter<T> using a FormatterCache ...
}
// Or create and store dynamic CompositeResolver
public static class MyOwnProjectResolver
{
public static readonly IJsonFormatterResolver Instance = CompositeResolver.Create(
/* IJsonFormatter[] */,
/* IJsonFormatterResolver[] */
);
}