From 83950bb97ad7f1836c5e8baf0198ad1150c9e2eb Mon Sep 17 00:00:00 2001 From: Rico Suter Date: Tue, 26 Sep 2023 13:45:34 +0200 Subject: [PATCH] Fix struct handling, closes #1624 --- .../Generation/StructTests.cs | 37 +++++++++++++++++++ .../NJsonSchema.NewtonsoftJson.Tests.csproj | 32 ++++++++++++++++ src/NJsonSchema.sln | 19 ++++++++++ .../Generation/JsonSchemaGenerator.cs | 6 +-- 4 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 src/NJsonSchema.NewtonsoftJson.Tests/Generation/StructTests.cs create mode 100644 src/NJsonSchema.NewtonsoftJson.Tests/NJsonSchema.NewtonsoftJson.Tests.csproj diff --git a/src/NJsonSchema.NewtonsoftJson.Tests/Generation/StructTests.cs b/src/NJsonSchema.NewtonsoftJson.Tests/Generation/StructTests.cs new file mode 100644 index 000000000..5e2debd62 --- /dev/null +++ b/src/NJsonSchema.NewtonsoftJson.Tests/Generation/StructTests.cs @@ -0,0 +1,37 @@ +using Newtonsoft.Json; +using NJsonSchema.Annotations; +using NJsonSchema.NewtonsoftJson.Generation; +using Xunit; + +namespace NJsonSchema.NewtonsoftJson.Tests.Generation +{ + public class StructTests + { + [JsonSchema("UserDefinedStruct")] + public struct UserDefinedStruct + { + } + + public class UserDefinedClass + { + [JsonProperty] + public readonly UserDefinedStruct NonNullableField; + + [JsonProperty] + public readonly UserDefinedStruct? NullableField; + } + + [Fact] + public void Should_have_a_shared_struct_schema() + { + //// Arrange + + //// Act + var schema = NewtonsoftJsonSchemaGenerator.FromType(); + var data = schema.ToJson(); + + //// Assert + Assert.Equal(1, schema.Definitions.Count); + } + } +} \ No newline at end of file diff --git a/src/NJsonSchema.NewtonsoftJson.Tests/NJsonSchema.NewtonsoftJson.Tests.csproj b/src/NJsonSchema.NewtonsoftJson.Tests/NJsonSchema.NewtonsoftJson.Tests.csproj new file mode 100644 index 000000000..43a8c96a5 --- /dev/null +++ b/src/NJsonSchema.NewtonsoftJson.Tests/NJsonSchema.NewtonsoftJson.Tests.csproj @@ -0,0 +1,32 @@ + + + + net6.0;net462 + false + false + + + + bin\Debug\$(TargetFramework)\NJsonSchema.Tests.xml + $(NoWarn),618,1587,1998,1591 + + + + + + + + + + + + + + + + + + + + + diff --git a/src/NJsonSchema.sln b/src/NJsonSchema.sln index 27c8257cc..82e1dde61 100644 --- a/src/NJsonSchema.sln +++ b/src/NJsonSchema.sln @@ -41,6 +41,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "_build", "..\build\_build.c EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NJsonSchema.NewtonsoftJson", "NJsonSchema.NewtonsoftJson\NJsonSchema.NewtonsoftJson.csproj", "{A9C2A9CD-44F6-4A21-9D72-00CF5BE0A36F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NJsonSchema.NewtonsoftJson.Tests", "NJsonSchema.NewtonsoftJson.Tests\NJsonSchema.NewtonsoftJson.Tests.csproj", "{AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -269,6 +271,22 @@ Global {A9C2A9CD-44F6-4A21-9D72-00CF5BE0A36F}.Release|x64.Build.0 = Release|Any CPU {A9C2A9CD-44F6-4A21-9D72-00CF5BE0A36F}.Release|x86.ActiveCfg = Release|Any CPU {A9C2A9CD-44F6-4A21-9D72-00CF5BE0A36F}.Release|x86.Build.0 = Release|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Debug|ARM.ActiveCfg = Debug|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Debug|ARM.Build.0 = Debug|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Debug|x64.ActiveCfg = Debug|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Debug|x64.Build.0 = Debug|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Debug|x86.ActiveCfg = Debug|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Debug|x86.Build.0 = Debug|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Release|Any CPU.Build.0 = Release|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Release|ARM.ActiveCfg = Release|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Release|ARM.Build.0 = Release|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Release|x64.ActiveCfg = Release|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Release|x64.Build.0 = Release|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Release|x86.ActiveCfg = Release|Any CPU + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -283,6 +301,7 @@ Global {E59CE32B-181F-4AAE-BF62-772AEEFC3177} = {785552E3-F3BB-4AEB-B5CF-819AE38AEA8F} {990EF464-C967-4E08-8C3D-0568A47B6D2A} = {785552E3-F3BB-4AEB-B5CF-819AE38AEA8F} {8E4E5A64-B5B7-4718-A92F-CB6B08512264} = {863B2D88-A0BD-4466-8583-AAD0B8D3F182} + {AFA1E1E7-37F9-4958-B0E3-ADB12F53E563} = {785552E3-F3BB-4AEB-B5CF-819AE38AEA8F} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9D5EDC80-5611-493B-804B-8B364816952B} diff --git a/src/NJsonSchema/Generation/JsonSchemaGenerator.cs b/src/NJsonSchema/Generation/JsonSchemaGenerator.cs index a13b0322f..95159187c 100644 --- a/src/NJsonSchema/Generation/JsonSchemaGenerator.cs +++ b/src/NJsonSchema/Generation/JsonSchemaGenerator.cs @@ -156,7 +156,7 @@ public virtual void Generate(TSchemaType schema, ContextualType con if (schemaResolver.RootObject == schema) { - schema.Title = Settings.SchemaNameGenerator.Generate(typeDescription.ContextualType.OriginalType); + schema.Title = Settings.SchemaNameGenerator.Generate(typeDescription.ContextualType.Type); } if (typeDescription.Type.IsObject()) @@ -167,9 +167,9 @@ public virtual void Generate(TSchemaType schema, ContextualType con } else { - if (schemaResolver.HasSchema(typeDescription.ContextualType.OriginalType, false)) + if (schemaResolver.HasSchema(typeDescription.ContextualType.Type, false)) { - schema.Reference = schemaResolver.GetSchema(typeDescription.ContextualType.OriginalType, false); + schema.Reference = schemaResolver.GetSchema(typeDescription.ContextualType.Type, false); } else if (schema.GetType() == typeof(JsonSchema)) {