Skip to content

Commit

Permalink
Fixed SystemTextJson indexed properties handling. (#1701)
Browse files Browse the repository at this point in the history
* Fixed SystemTextJson indexed properties handling.

* Fixed CA1859 error.

* Revert "Fixed CA1859 error."

This reverts commit d7297d5.

* Disabled check for CA1859.

---------

Co-authored-by: ViktoriiaZheliezniak <viktoriia.zheliezniak@vinci-energies.net>
  • Loading branch information
viktoriia-zhel and ViktoriiaZheliezniak authored Jun 12, 2024
1 parent 083501d commit f353123
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using NJsonSchema.Generation;
Expand All @@ -24,6 +25,56 @@ public class ClassWithJsonElementExtensionData
public IDictionary<string, JsonElement> ExtensionData { get; set; }
}

public class ClassWithIndexedProperty
{
public double X { get; set; }
public double Y { get; set; }

public double this[int indexer]
{
get
{
switch (indexer)
{
case 0: return X;
case 1: return Y;
default: throw new ArgumentOutOfRangeException(nameof(indexer));
}
}
set
{
switch (indexer)
{
case 0: X = value; break;
case 1: Y = value; break;
default: throw new ArgumentOutOfRangeException(nameof(indexer));
}
}
}

public double this[string indexer]
{
get
{
switch (indexer)
{
case "X": return X;
case "Y": return Y;
default: throw new ArgumentOutOfRangeException(nameof(indexer));
}
}
set
{
switch (indexer)
{
case "X": X = value; break;
case "Y": Y = value; break;
default: throw new ArgumentOutOfRangeException(nameof(indexer));
}
}
}
}

[Fact]
public void SystemTextJson_When_class_has_object_Dictionary_with_JsonExtensionDataAttribute_on_property_then_AdditionalProperties_schema_is_set()
{
Expand Down Expand Up @@ -53,5 +104,19 @@ public void SystemTextJson_When_class_has_JsonElement_Dictionary_with_JsonExtens
Assert.True(schema.AllowAdditionalProperties);
Assert.True(schema.AdditionalPropertiesSchema.ActualSchema.IsAnyType);
}

[Fact]
public void SystemTextJson_When_class_has_Indexed_properties_then_Generates_schema_without_them()
{
// Act
var schema = JsonSchemaGenerator.FromType<ClassWithIndexedProperty>(new SystemTextJsonSchemaGeneratorSettings
{
SchemaType = SchemaType.JsonSchema
});

// Assert
Assert.Equal(2, schema.ActualProperties.Count);
Assert.All(schema.ActualProperties, property => Assert.False(string.Equals(property.Key, "Item", StringComparison.InvariantCultureIgnoreCase)));
}
}
}
7 changes: 5 additions & 2 deletions src/NJsonSchema/Generation/JsonSchemaGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1089,6 +1089,7 @@ private void GenerateInheritanceDiscriminator(Type type, JsonSchema schema, Json
}
}

#pragma warning disable CA1859
private object? TryGetInheritanceDiscriminatorConverter(Type type)
{
var typeAttributes = type.GetTypeInfo().GetCustomAttributes(false).OfType<Attribute>();
Expand All @@ -1099,8 +1100,8 @@ private void GenerateInheritanceDiscriminator(Type type, JsonSchema schema, Json
{
var converterType = (Type)jsonConverterAttribute.ConverterType;
if (converterType != null && (
converterType.IsAssignableToTypeName("JsonInheritanceConverter", TypeNameStyle.Name) || // Newtonsoft's converter
converterType.IsAssignableToTypeName("JsonInheritanceConverter`1", TypeNameStyle.Name) // System.Text.Json's converter
converterType.IsAssignableToTypeName("JsonInheritanceConverter", TypeNameStyle.Name) || // Newtonsoft's converter
converterType.IsAssignableToTypeName("JsonInheritanceConverter`1", TypeNameStyle.Name) // System.Text.Json's converter
))
{
return ObjectExtensions.HasProperty(jsonConverterAttribute, "ConverterParameters") &&
Expand All @@ -1125,6 +1126,8 @@ private void GenerateInheritanceDiscriminator(Type type, JsonSchema schema, Json

return null;
}
#pragma warning restore CA1859


private sealed class SystemTextJsonInheritanceWrapper
{
Expand Down
6 changes: 6 additions & 0 deletions src/NJsonSchema/Generation/SystemTextJsonReflectionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ public override void GenerateProperties(JsonSchema schema, ContextualType contex
continue;
}

if (accessorInfo.MemberInfo is PropertyInfo propInfo &&
propInfo.GetIndexParameters().Length > 0)
{
continue;
}

var propertyIgnored = false;
var jsonIgnoreAttribute = accessorInfo
.GetAttributes(true)
Expand Down

0 comments on commit f353123

Please sign in to comment.