JsonSchemaGeneratorSettings
The JSON Schema generator settings.
using Namotion.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using NJsonSchema.Generation.TypeMappers;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Reflection;
namespace NJsonSchema.Generation
{
public class JsonSchemaGeneratorSettings
{
private Dictionary<string, JsonContract> _cachedContracts = new Dictionary<string, JsonContract>();
private EnumHandling _defaultEnumHandling;
private PropertyNameHandling _defaultPropertyNameHandling;
private JsonSerializerSettings _serializerSettings;
private IContractResolver _contractResolver;
public ReferenceTypeNullHandling DefaultReferenceTypeNullHandling { get; set; }
public ReferenceTypeNullHandling DefaultDictionaryValueReferenceTypeNullHandling { get; set; }
public bool GenerateAbstractProperties { get; set; }
public bool FlattenInheritanceHierarchy { get; set; }
public bool GenerateAbstractSchemas { get; set; }
public bool GenerateKnownTypes { get; set; } = true;
public bool GenerateXmlObjects { get; set; }
public bool IgnoreObsoleteProperties { get; set; }
public bool AllowReferencesWithProperties { get; set; }
public bool GenerateEnumMappingDescription { get; set; }
public bool AlwaysAllowAdditionalObjectProperties { get; set; }
public bool GenerateExamples { get; set; }
public SchemaType SchemaType { get; set; }
[JsonIgnore]
public JsonSerializerSettings SerializerSettings {
get {
return _serializerSettings;
}
set {
_serializerSettings = value;
UpdateActualContractResolverAndSerializerSettings();
}
}
public string[] ExcludedTypeNames { get; set; }
[JsonIgnore]
public ITypeNameGenerator TypeNameGenerator { get; set; }
[JsonIgnore]
public ISchemaNameGenerator SchemaNameGenerator { get; set; }
[JsonIgnore]
public IReflectionService ReflectionService { get; set; }
[JsonIgnore]
public ICollection<ITypeMapper> TypeMappers { get; set; } = new Collection<ITypeMapper>();
[JsonIgnore]
public ICollection<ISchemaProcessor> SchemaProcessors { get; } = new Collection<ISchemaProcessor>();
public bool GenerateCustomNullableProperties { get; set; }
[JsonIgnore]
[Obsolete("Use SerializerSettings directly instead. In NSwag.AspNetCore the property is set automatically.")]
public IContractResolver ContractResolver {
get {
return _contractResolver;
}
set {
_contractResolver = value;
UpdateActualContractResolverAndSerializerSettings();
}
}
[Obsolete("Use SerializerSettings directly instead. In NSwag.AspNetCore the property is set automatically.")]
public PropertyNameHandling DefaultPropertyNameHandling {
get {
return _defaultPropertyNameHandling;
}
set {
_defaultPropertyNameHandling = value;
UpdateActualContractResolverAndSerializerSettings();
}
}
[Obsolete("Use SerializerSettings directly instead. In NSwag.AspNetCore the property is set automatically.")]
public EnumHandling DefaultEnumHandling {
get {
return _defaultEnumHandling;
}
set {
_defaultEnumHandling = value;
UpdateActualSerializerSettings();
}
}
[JsonIgnore]
public IContractResolver ActualContractResolver { get; set; }
[JsonIgnore]
public JsonSerializerSettings ActualSerializerSettings { get; set; }
public JsonSchemaGeneratorSettings()
{
DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.Null;
DefaultDictionaryValueReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull;
SchemaType = SchemaType.JsonSchema;
GenerateAbstractSchemas = true;
GenerateExamples = true;
DefaultEnumHandling = EnumHandling.Integer;
DefaultPropertyNameHandling = PropertyNameHandling.Default;
ContractResolver = null;
TypeNameGenerator = new DefaultTypeNameGenerator();
SchemaNameGenerator = new DefaultSchemaNameGenerator();
ReflectionService = new DefaultReflectionService();
ExcludedTypeNames = new string[0];
}
public JsonContract ResolveContract(Type type)
{
string fullName = type.FullName;
if (fullName == null)
return null;
if (!_cachedContracts.ContainsKey(fullName)) {
lock (_cachedContracts) {
if (!_cachedContracts.ContainsKey(fullName))
_cachedContracts[fullName] = ((!type.GetTypeInfo().IsGenericTypeDefinition) ? ActualContractResolver.ResolveContract(type) : null);
}
}
return _cachedContracts[fullName];
}
public bool GetActualGenerateAbstractSchema(Type type)
{
object obj = EnumerableExtensions.FirstAssignableToTypeNameOrDefault<object>((IEnumerable<object>)type.GetTypeInfo().GetCustomAttributes(false), "JsonSchemaAbstractAttribute", 0);
if (!GenerateAbstractSchemas || obj != null) {
if (obj == null)
return false;
return ObjectExtensions.TryGetPropertyValue<bool>(obj, "IsAbstract", true);
}
return true;
}
public bool GetActualFlattenInheritanceHierarchy(Type type)
{
object obj = EnumerableExtensions.FirstAssignableToTypeNameOrDefault<object>((IEnumerable<object>)type.GetTypeInfo().GetCustomAttributes(false), "JsonSchemaFlattenAttribute", 0);
if (!FlattenInheritanceHierarchy || obj != null) {
if (obj == null)
return false;
return ObjectExtensions.TryGetPropertyValue<bool>(obj, "Flatten", true);
}
return true;
}
private void UpdateActualContractResolverAndSerializerSettings()
{
_cachedContracts = new Dictionary<string, JsonContract>();
if (SerializerSettings != null) {
if (DefaultPropertyNameHandling != 0)
throw new InvalidOperationException("The setting DefaultPropertyNameHandling cannot be used when ContractResolver or SerializerSettings is set.");
if (ContractResolver != null)
throw new InvalidOperationException("The setting ContractResolver cannot be used when SerializerSettings is set.");
ActualContractResolver = SerializerSettings.ContractResolver;
} else if (ContractResolver != null) {
if (DefaultPropertyNameHandling != 0)
throw new InvalidOperationException("The setting DefaultPropertyNameHandling cannot be used when ContractResolver or SerializerSettings is set.");
ActualContractResolver = ContractResolver;
} else if (DefaultPropertyNameHandling == PropertyNameHandling.CamelCase) {
ActualContractResolver = new CamelCasePropertyNamesContractResolver();
} else if (DefaultPropertyNameHandling == PropertyNameHandling.SnakeCase) {
ActualContractResolver = new DefaultContractResolver {
NamingStrategy = new SnakeCaseNamingStrategy()
};
} else {
ActualContractResolver = new DefaultContractResolver();
}
UpdateActualSerializerSettings();
}
private void UpdateActualSerializerSettings()
{
if (SerializerSettings != null) {
if (DefaultPropertyNameHandling != 0)
throw new InvalidOperationException("The setting DefaultPropertyNameHandling cannot be used when ContractResolver or SerializerSettings is set.");
if (ContractResolver != null)
throw new InvalidOperationException("The setting ContractResolver cannot be used when SerializerSettings is set.");
if (DefaultEnumHandling != 0)
throw new InvalidOperationException("The setting DefaultEnumHandling cannot be used when SerializerSettings is set.");
ActualSerializerSettings = SerializerSettings;
} else {
JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.ContractResolver = ActualContractResolver;
if (DefaultEnumHandling == EnumHandling.String)
jsonSerializerSettings.Converters.Add(new StringEnumConverter());
else if (DefaultEnumHandling == EnumHandling.CamelCaseString) {
jsonSerializerSettings.Converters.Add(new StringEnumConverter(true));
}
ActualSerializerSettings = jsonSerializerSettings;
}
}
}
}