From d05c29ea1a5eaa71a6276e52e222d117ee7440ff Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Mar 2026 19:51:28 +0000 Subject: [PATCH 1/2] Initial plan From a5c0e965970e3406fb4166ceacba765e3ee772d5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Mar 2026 20:06:08 +0000 Subject: [PATCH 2/2] Add support for EnumDataType annotation in JSON schema generation Co-authored-by: lahma <171892+lahma@users.noreply.github.com> --- .../Generation/EnumGenerationTests.cs | 34 +++++++++++++++++++ .../Generation/ReflectionServiceBase.cs | 12 +++++++ 2 files changed, 46 insertions(+) diff --git a/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs b/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs index 1002396a5..d6a57128e 100644 --- a/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs +++ b/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs @@ -231,5 +231,39 @@ public async Task When_enum_property_is_required_then_MinLength_is_not_set() Assert.True(schema.Properties["Bar"].OneOf.Count == 0); Assert.True(schema.Properties["Bar"].Reference != null); } + + public class ClassWithEnumDataTypeOnString + { + [EnumDataType(typeof(Bar))] + public string BarValue { get; set; } + } + + public class ClassWithEnumDataTypeOnInt + { + [EnumDataType(typeof(Bar))] + public int BarValue { get; set; } + } + + [Fact] + public async Task When_string_property_has_EnumDataType_annotation_then_schema_has_enum() + { + // Arrange & Act + var schema = NewtonsoftJsonSchemaGenerator.FromType(new NewtonsoftJsonSchemaGeneratorSettings()); + + // Assert + Assert.True(schema.Properties["BarValue"].ActualTypeSchema.IsEnumeration); + Assert.Equal(3, schema.Properties["BarValue"].ActualTypeSchema.Enumeration.Count); + } + + [Fact] + public async Task When_int_property_has_EnumDataType_annotation_then_schema_has_enum() + { + // Arrange & Act + var schema = NewtonsoftJsonSchemaGenerator.FromType(new NewtonsoftJsonSchemaGeneratorSettings()); + + // Assert + Assert.True(schema.Properties["BarValue"].ActualTypeSchema.IsEnumeration); + Assert.Equal(3, schema.Properties["BarValue"].ActualTypeSchema.Enumeration.Count); + } } } \ No newline at end of file diff --git a/src/NJsonSchema/Generation/ReflectionServiceBase.cs b/src/NJsonSchema/Generation/ReflectionServiceBase.cs index 0114b2ef0..4befbb225 100644 --- a/src/NJsonSchema/Generation/ReflectionServiceBase.cs +++ b/src/NJsonSchema/Generation/ReflectionServiceBase.cs @@ -51,6 +51,18 @@ public JsonTypeDescription GetDescription(ContextualType contextualType, Referen } } + dynamic? enumDataTypeAttribute = contextualType.GetContextAttributes(true) + .FirstAssignableToTypeNameOrDefault("System.ComponentModel.DataAnnotations.EnumDataTypeAttribute"); + if (enumDataTypeAttribute != null) + { + var enumType = (Type)enumDataTypeAttribute.EnumType; + if (enumType != null && enumType.IsEnum) + { + type = enumType; + contextualType = enumType.ToContextualType(); + } + } + var jsonSchemaAttribute = contextualType.GetContextOrTypeAttribute(true); ; if (jsonSchemaAttribute != null) {