diff --git a/src/NJsonSchema.Tests/Generation/AttributeGenerationTests.cs b/src/NJsonSchema.Tests/Generation/AttributeGenerationTests.cs index 46067a9af..a3dc11d84 100644 --- a/src/NJsonSchema.Tests/Generation/AttributeGenerationTests.cs +++ b/src/NJsonSchema.Tests/Generation/AttributeGenerationTests.cs @@ -299,5 +299,41 @@ public async Task When_dictionary_property_has_regex_attribute_then_regex_is_add Assert.Null(schema.Properties["Versions"].Pattern); Assert.NotNull(schema.Properties["Versions"].AdditionalPropertiesSchema.ActualSchema.Pattern); } + + public class ClassWithRequiredDateTimeProperties + { + [Required] + public DateTime RequiredDateTime { get; set; } + + [Required] + public DateTimeOffset RequiredDateTimeOffset { get; set; } + +#if NET6_0_OR_GREATER + [Required] + public DateOnly RequiredDateOnly { get; set; } + + [Required] + public TimeOnly RequiredTimeOnly { get; set; } +#endif + + [Required] + public string RequiredString { get; set; } + } + + [Fact] + public void When_required_DateTime_then_MinLength_is_not_set() + { + // Act + var schema = NewtonsoftJsonSchemaGenerator.FromType(); + + // Assert + Assert.Null(schema.Properties["RequiredDateTime"].MinLength); + Assert.Null(schema.Properties["RequiredDateTimeOffset"].MinLength); +#if NET6_0_OR_GREATER + Assert.Null(schema.Properties["RequiredDateOnly"].MinLength); + Assert.Null(schema.Properties["RequiredTimeOnly"].MinLength); +#endif + Assert.Equal(1, schema.Properties["RequiredString"].MinLength); + } } } \ No newline at end of file diff --git a/src/NJsonSchema/Generation/JsonSchemaGenerator.cs b/src/NJsonSchema/Generation/JsonSchemaGenerator.cs index eadb12a98..7392fa81a 100644 --- a/src/NJsonSchema/Generation/JsonSchemaGenerator.cs +++ b/src/NJsonSchema/Generation/JsonSchemaGenerator.cs @@ -1205,7 +1205,8 @@ public void AddProperty( if (hasRequiredAttribute && !propertyTypeDescription.IsEnum && propertyTypeDescription.Type == JsonObjectType.String && - !requiredAttribute.TryGetPropertyValue("AllowEmptyStrings", false)) + !requiredAttribute.TryGetPropertyValue("AllowEmptyStrings", false) && + !IsDateTimeFormat(propertyTypeDescription.Format)) { propertySchema.MinLength = 1; } @@ -1306,6 +1307,12 @@ public bool IsPropertyIgnoredBySettings(ContextualAccessorInfo accessorInfo) return accessorInfo.GetAttributes(true).FirstAssignableToTypeNameOrDefault("DataMemberAttribute", TypeNameStyle.Name); } + private static bool IsDateTimeFormat(string? format) + { + return format is JsonFormatStrings.DateTime or JsonFormatStrings.Date or JsonFormatStrings.Time + or JsonFormatStrings.Duration or JsonFormatStrings.TimeSpan; + } + private static bool HasDataContractAttribute(Type parentType) { return parentType.ToCachedType()