<PackageReference Include="NJsonSchema" Version="10.0.26" />

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