Skip to content

Commit f9e601f

Browse files
authored
Merge pull request #18 from IvanMurzak/feature/dictionary-json-schema-ignore
Feature/dictionary json schema ignore
2 parents f6dde97 + e042542 commit f9e601f

11 files changed

Lines changed: 103 additions & 16 deletions

File tree

ConsoleApp/ConsoleApp.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
</ItemGroup>
1414

1515
<ItemGroup>
16-
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.7" />
16+
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.10" />
1717
</ItemGroup>
1818

1919
</Project>

ReflectorNet.Tests.OuterAssembly/ReflectorNet.Tests.OuterAssembly.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="System.Text.Json" Version="9.0.7" />
11+
<PackageReference Include="System.Text.Json" Version="9.0.10" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

ReflectorNet.Tests/ReflectorNet.Tests.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
12-
<PackageReference Include="System.Text.Json" Version="9.0.7" />
11+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
12+
<PackageReference Include="System.Text.Json" Version="9.0.10" />
1313
<PackageReference Include="xunit" Version="2.9.3" />
14-
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.3" />
14+
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5" />
1515
</ItemGroup>
1616

1717
<ItemGroup>

ReflectorNet.Tests/SchemaTests/CollectionsTests.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,18 @@ public void GetTypeId_SimpleArray_ShouldAppendArray()
6363
// Assert
6464
Assert.NotNull(result);
6565
Assert.NotNull(result[JsonSchema.Type]);
66-
Assert.Equal(JsonSchema.Array, result[JsonSchema.Type]!.ToString());
6766

68-
Assert.NotNull(result[JsonSchema.Items]);
67+
if (TypeUtils.IsDictionary(type))
68+
{
69+
Assert.Equal(JsonSchema.Object, result[JsonSchema.Type]!.ToString());
70+
Assert.NotNull(result[JsonSchema.AdditionalProperties]);
71+
}
72+
else
73+
{
74+
Assert.Equal(JsonSchema.Array, result[JsonSchema.Type]!.ToString());
75+
Assert.NotNull(result[JsonSchema.Items]);
76+
}
77+
6978

7079
Assert.Null(result[nameof(ListType.shouldBeIgnored)]);
7180
Assert.Null(result[nameof(ListType.ShouldBeIgnored)]);

ReflectorNet.Tests/SchemaTests/SchemaTestBase.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ namespace com.IvanMurzak.ReflectorNet.Tests.SchemaTests
1010
{
1111
public abstract class SchemaTestBase : BaseTest
1212
{
13+
static readonly Type[] RestrictedDefineTypes = new Type[]
14+
{
15+
typeof(string),
16+
typeof(object),
17+
typeof(DateTime),
18+
typeof(DateTimeOffset),
19+
typeof(Guid),
20+
typeof(TimeSpan),
21+
typeof(Uri)
22+
};
1323
protected SchemaTestBase(ITestOutputHelper output) : base(output)
1424
{
1525
}
@@ -264,6 +274,13 @@ protected void AssertAllRefsDefined(JsonNode schema)
264274
return;
265275
}
266276

277+
// References don't include restricted types
278+
foreach (var reference in allReferences)
279+
{
280+
Assert.False(RestrictedDefineTypes.Any(x => JsonSchema.RefValue + x.GetSchemaTypeId() == reference),
281+
$"Reference '{reference}' is for a restricted type that should not appear as a $ref.");
282+
}
283+
267284
// Schema must have $defs if there are references
268285
Assert.True(schema.AsObject().ContainsKey(JsonSchema.Defs),
269286
$"Schema contains {allReferences.Count} $ref reference(s) but no $defs section. References: {string.Join(", ", allReferences)}");
@@ -281,6 +298,13 @@ protected void AssertAllRefsDefined(JsonNode schema)
281298
$"Reference '{reference}' (type ID: '{typeId}') is not defined in $defs. " +
282299
$"Available definitions: {string.Join(", ", defines.Select(d => d.Key))}");
283300
}
301+
302+
// Defines don't include restricted types
303+
foreach (var define in defines)
304+
{
305+
Assert.False(RestrictedDefineTypes.Any(x => x.GetSchemaTypeId() == define.Key),
306+
$"Reference '{define.Key}' is for a restricted type that should not appear as a $ref.");
307+
}
284308
}
285309

286310
/// <summary>

ReflectorNet/ReflectorNet.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
</ItemGroup>
2828

2929
<ItemGroup>
30-
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.7" />
31-
<PackageReference Include="System.Text.Json" Version="9.0.7" />
30+
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.10" />
31+
<PackageReference Include="System.Text.Json" Version="9.0.10" />
3232
</ItemGroup>
3333

3434
</Project>

ReflectorNet/src/Convertor/Json/SerializedMemberConverter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public SerializedMemberConverter(Reflector reflector)
9393
public override IEnumerable<Type> GetDefinedTypes()
9494
{
9595
yield return typeof(SerializedMemberList);
96+
yield return typeof(SerializedMember);
9697
}
9798

9899
public override SerializedMember? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)

ReflectorNet/src/Convertor/Json/SerializedMemberListConverter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public SerializedMemberListConverter(Reflector reflector)
3838
};
3939
public override IEnumerable<Type> GetDefinedTypes()
4040
{
41+
yield return typeof(SerializedMemberList);
4142
yield return typeof(SerializedMember);
4243
}
4344

ReflectorNet/src/Utils/Json/JsonSchema.Internal.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,6 @@ JsonNode GenerateSchemaFromType(Reflector reflector, Type type, JsonObject defin
149149
var required = new JsonArray();
150150
var schema = new JsonObject { [Type] = Object };
151151

152-
defines ??= new();
153-
154152
// Get serializable fields
155153
var fields = reflector.GetSerializableFields(type);
156154
if (fields != null)
@@ -231,13 +229,13 @@ JsonNode GenerateSchemaFromType(Reflector reflector, Type type, JsonObject defin
231229
}
232230
}
233231

232+
if (properties.Count > 0)
233+
schema[Properties] = properties;
234+
234235
// Add required array if it has items
235236
if (required.Count > 0)
236237
schema[Required] = required;
237238

238-
if (properties.Count > 0)
239-
schema[Properties] = properties;
240-
241239
return schema;
242240
}
243241

ReflectorNet/src/Utils/Json/JsonSchema.cs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,31 @@ public JsonNode GetSchema(Reflector reflector, Type type, JsonObject? defines =
162162
defines[defTypeId] = def;
163163
}
164164
}
165+
else if (TypeUtils.IsDictionary(type))
166+
{
167+
var genericArgs = TypeUtils.GetDictionaryGenericArguments(type);
168+
if (genericArgs == null)
169+
throw new InvalidOperationException($"Unable to get generic arguments for dictionary type '{type.GetTypeName(pretty: false)}'.");
170+
171+
foreach (var genericArgument in genericArgs)
172+
{
173+
if (TypeUtils.IsPrimitive(genericArgument))
174+
continue;
175+
176+
var defTypeId = genericArgument.GetSchemaTypeId();
177+
if (defines.ContainsKey(defTypeId))
178+
continue;
179+
180+
var defSchema = GetSchema(reflector, genericArgument, defines);
181+
if (defSchema != null)
182+
defines[defTypeId] = defSchema;
183+
}
184+
185+
if (definesNeeded && !defineContainsType)
186+
defines[typeId] = schema;
187+
188+
schema = new JsonObject { [Type] = Object, [AdditionalProperties] = true };
189+
}
165190
else
166191
{
167192
schema = GenerateSchemaFromType(reflector, type, defines);
@@ -530,8 +555,7 @@ public JsonNode GenerateSchema(
530555
var schema = new JsonObject
531556
{
532557
// [SchemaDraft] = JsonValue.Create(SchemaDraftValue),
533-
[Type] = Object,
534-
[Properties] = properties
558+
[Type] = Object
535559
};
536560

537561
foreach (var parameter in types)
@@ -588,8 +612,12 @@ public JsonNode GenerateSchema(
588612
}
589613
}
590614

615+
if (properties.Count > 0)
616+
schema[Properties] = properties;
617+
591618
if (defines.Count > 0 && needToAddDefines)
592619
schema[Defs] = defines;
620+
593621
if (required.Count > 0)
594622
schema[Required] = required;
595623

0 commit comments

Comments
 (0)