private void LoadProperty(PropertyInfo property, JsonSchema4 parentSchema, JsonSchema4 rootSchema, ISchemaDefinitionAppender schemaDefinitionAppender, ISchemaResolver schemaResolver) { var propertyType = property.PropertyType; var propertyTypeDescription = JsonObjectTypeDescription.FromType(propertyType, property.GetCustomAttributes(), Settings.DefaultEnumHandling); var attributes = property.GetCustomAttributes().ToArray(); if (attributes.All(a => !(a is JsonIgnoreAttribute))) { if (propertyType.Name == "Nullable`1") { propertyType = propertyType.GenericTypeArguments[0]; } JsonProperty jsonProperty; if (!propertyTypeDescription.IsDictionary && (propertyTypeDescription.Type.HasFlag(JsonObjectType.Object) || propertyTypeDescription.IsEnum)) { var jsonPropertySchema = Generate <JsonSchema4>(propertyType, rootSchema, property.GetCustomAttributes(), schemaDefinitionAppender, schemaResolver); if (jsonPropertySchema.ActualSchema.IsAnyType) { jsonProperty = JsonProperty.FromJsonSchema(string.Empty, jsonPropertySchema.ActualSchema); } else { jsonProperty = new JsonProperty(); jsonProperty.SchemaReference = jsonPropertySchema.ActualSchema; // schema is automatically added to Definitions if it is missing in JsonPathUtilities.GetJsonPath() } } else { jsonProperty = Generate <JsonProperty>(propertyType, rootSchema, property.GetCustomAttributes(), schemaDefinitionAppender, schemaResolver); } propertyTypeDescription.ApplyType(jsonProperty); var propertyName = JsonPathUtilities.GetPropertyName(property); parentSchema.Properties.Add(propertyName, jsonProperty); var requiredAttribute = TryGetAttribute(attributes, "System.ComponentModel.DataAnnotations.RequiredAttribute"); var jsonPropertyAttribute = property.GetCustomAttribute <JsonPropertyAttribute>(); var hasJsonNetAttributeRequired = jsonPropertyAttribute != null && ( jsonPropertyAttribute.Required == Required.Always || jsonPropertyAttribute.Required == Required.AllowNull); var hasRequiredAttribute = requiredAttribute != null; if (hasRequiredAttribute || hasJsonNetAttributeRequired) { parentSchema.RequiredProperties.Add(propertyName); } var isJsonNetAttributeNullable = jsonPropertyAttribute != null && jsonPropertyAttribute.Required == Required.AllowNull; var isNullable = propertyTypeDescription.IsAlwaysRequired == false; if (!hasRequiredAttribute && (isNullable || isJsonNetAttributeNullable)) { jsonProperty.Type = jsonProperty.Type | JsonObjectType.Null; } dynamic readOnlyAttribute = TryGetAttribute(attributes, "System.ComponentModel.ReadOnlyAttribute"); if (readOnlyAttribute != null) { jsonProperty.IsReadOnly = readOnlyAttribute.IsReadOnly; } jsonProperty.Description = GetDescription(property, attributes); ApplyPropertyAnnotations(jsonProperty, attributes, propertyTypeDescription); } }