Skip to content

Commit c6e01d7

Browse files
committed
Tolerate schema properties named AdditionalProperties
1 parent 63ee615 commit c6e01d7

File tree

3 files changed

+50
-7
lines changed

3 files changed

+50
-7
lines changed

src/NJsonSchema.CodeGeneration.CSharp.Tests/GeneralGeneratorTests.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
using Newtonsoft.Json;
1414
using Newtonsoft.Json.Converters;
1515
using NJsonSchema.Annotations;
16-
using NJsonSchema.Generation;
1716
using NJsonSchema.NewtonsoftJson.Generation;
1817
using Xunit;
1918

@@ -1890,6 +1889,35 @@ public async Task When_schema_has_AdditionProperties_schema_then_JsonExtensionDa
18901889

18911890
//// Assert
18921891
Assert.Contains("JsonExtensionData", output);
1892+
Assert.Contains("IDictionary<string, object> AdditionalProperties\n", output);
1893+
}
1894+
1895+
1896+
public class ClassWithAdditionalProperties
1897+
{
1898+
public string AdditionalProperties { get; set; }
1899+
1900+
[JsonExtensionData]
1901+
public IDictionary<string, object> ExtensionData { get; set; }
1902+
}
1903+
1904+
[Fact]
1905+
public async Task When_schema_has_AdditionProperties_schema_and_type_has_member_with_same_name()
1906+
{
1907+
//// Arrange
1908+
var schema = NewtonsoftJsonSchemaGenerator.FromType<ClassWithAdditionalProperties>(new NewtonsoftJsonSchemaGeneratorSettings { SchemaType = SchemaType.OpenApi3 });
1909+
var json = schema.ToJson();
1910+
1911+
var generator = new CSharpGenerator(schema, new CSharpGeneratorSettings
1912+
{
1913+
ClassStyle = CSharpClassStyle.Poco
1914+
});
1915+
1916+
//// Act
1917+
var output = generator.GenerateFile("PersonAddress");
1918+
1919+
//// Assert
1920+
Assert.Contains("IDictionary<string, object> AdditionalProperties2\n", output);
18931921
}
18941922

18951923
[Fact]

src/NJsonSchema.CodeGeneration.CSharp/Models/ClassTemplateModel.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class ClassTemplateModel : ClassTemplateModelBase
1818
private readonly CSharpTypeResolver _resolver;
1919
private readonly JsonSchema _schema;
2020
private readonly CSharpGeneratorSettings _settings;
21+
private readonly List<PropertyModel> _properties;
2122

2223
/// <summary>Initializes a new instance of the <see cref="ClassTemplateModel"/> class.</summary>
2324
/// <param name="typeName">Name of the type.</param>
@@ -34,10 +35,21 @@ public ClassTemplateModel(string typeName, CSharpGeneratorSettings settings,
3435
_settings = settings;
3536

3637
ClassName = typeName;
37-
Properties = _schema.ActualProperties.Values
38-
.Where(p => !p.IsInheritanceDiscriminator)
39-
.Select(property => new PropertyModel(this, property, _resolver, _settings))
40-
.ToArray();
38+
39+
AdditionalPropertiesPropertyName = "AdditionalProperties";
40+
var actualProperties = _schema.ActualProperties;
41+
_properties = new List<PropertyModel>(actualProperties.Count);
42+
foreach (var property in actualProperties.Values)
43+
{
44+
if (!property.IsInheritanceDiscriminator)
45+
{
46+
_properties.Add(new PropertyModel(this, property, _resolver, _settings));
47+
if (property.Name == AdditionalPropertiesPropertyName)
48+
{
49+
AdditionalPropertiesPropertyName += "2";
50+
}
51+
}
52+
}
4153

4254
if (schema.InheritedSchema != null)
4355
{
@@ -85,8 +97,11 @@ public ClassTemplateModel(string typeName, CSharpGeneratorSettings settings,
8597
// _schema.AdditionalPropertiesSchema.IsNullable(_settings.SchemaType),
8698
// string.Empty) : null;
8799

100+
/// <summary>Gets property name for the additional properties.</summary>
101+
public string? AdditionalPropertiesPropertyName { get; private set; }
102+
88103
/// <summary>Gets the property models.</summary>
89-
public IEnumerable<PropertyModel> Properties { get; }
104+
public IEnumerable<PropertyModel> Properties => _properties;
90105

91106
/// <summary>Gets the property models with inherited properties.</summary>
92107
public IEnumerable<PropertyModel> AllProperties { get; }

src/NJsonSchema.CodeGeneration.CSharp/Templates/Class.liquid

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@
130130
{%- else -%}
131131
[Newtonsoft.Json.JsonExtensionData]
132132
{%- endif -%}
133-
public System.Collections.Generic.IDictionary<string, {{ AdditionalPropertiesType }}> AdditionalProperties
133+
public System.Collections.Generic.IDictionary<string, {{ AdditionalPropertiesType }}> {{ AdditionalPropertiesPropertyName }}
134134
{
135135
get { return _additionalProperties ?? (_additionalProperties = new System.Collections.Generic.Dictionary<string, {{ AdditionalPropertiesType }}>()); }
136136
{{PropertySetterAccessModifier}}set { _additionalProperties = value; }

0 commit comments

Comments
 (0)