Skip to content

Commit b235cd9

Browse files
committed
Add PropertyNameCaseInsensitive support
1 parent e99f0a0 commit b235cd9

3 files changed

Lines changed: 41 additions & 5 deletions

File tree

src/Protobuf.System.Text.Json/ProtobufConverter.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace Protobuf.System.Text.Json;
1212
private readonly FieldInfo[] _fields;
1313
private readonly Dictionary<string, FieldInfo> _fieldsLookup;
1414

15-
public ProtobufConverter(JsonNamingPolicy? namingPolicy, JsonProtobufSerializerOptions options)
15+
public ProtobufConverter(JsonSerializerOptions jsonSerializerOptions, JsonProtobufSerializerOptions jsonProtobufSerializerOptions)
1616
{
1717
var type = typeof(T);
1818

@@ -21,7 +21,7 @@ public ProtobufConverter(JsonNamingPolicy? namingPolicy, JsonProtobufSerializerO
2121
var propertyInfo = type.GetProperty("Descriptor", BindingFlags.Public | BindingFlags.Static);
2222
var messageDescriptor = (MessageDescriptor) propertyInfo?.GetValue(null, null)!;
2323

24-
var convertNameFunc = GetConvertNameFunc(namingPolicy, options.UseProtobufJsonNames);
24+
var convertNameFunc = GetConvertNameFunc(jsonSerializerOptions.PropertyNamingPolicy, jsonProtobufSerializerOptions.UseProtobufJsonNames);
2525

2626
_fields = messageDescriptor.Fields.InDeclarationOrder().Select(fieldDescriptor => new FieldInfo
2727
{
@@ -33,7 +33,8 @@ public ProtobufConverter(JsonNamingPolicy? namingPolicy, JsonProtobufSerializerO
3333
IsOneOf = fieldDescriptor.ContainingOneof != null
3434
}).ToArray();
3535

36-
_fieldsLookup = _fields.ToDictionary(x => x.JsonName, x => x);
36+
var stringComparer = jsonSerializerOptions.PropertyNameCaseInsensitive ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal;
37+
_fieldsLookup = _fields.ToDictionary(x => x.JsonName, x => x, stringComparer);
3738
}
3839

3940
private static Func<FieldDescriptor, string> GetConvertNameFunc(JsonNamingPolicy? jsonNamingPolicy, bool useProtobufJsonNames)

src/Protobuf.System.Text.Json/ProtobufJsonConverterFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public override bool CanConvert(Type typeToConvert)
1818
return typeof(IMessage).IsAssignableFrom(typeToConvert);
1919
}
2020

21-
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
21+
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions jsonSerializerOptions)
2222
{
2323
var converterType = typeof(ProtobufConverter<>).MakeGenericType(typeToConvert);
24-
return (JsonConverter) Activator.CreateInstance(converterType, new object[] {options.PropertyNamingPolicy, _options})!;
24+
return (JsonConverter) Activator.CreateInstance(converterType, new object[] {jsonSerializerOptions, _options})!;
2525
}
2626
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Protobuf.Tests;
3+
using Shouldly;
4+
using Xunit;
5+
6+
namespace Protobuf.System.Text.Json.Tests;
7+
8+
public class PropertyNameCaseInsensitiveTests
9+
{
10+
[Fact]
11+
public void Should_support_PropertyNameCaseInsensitive_setting()
12+
{
13+
var originalMessage = new SimpleMessage
14+
{
15+
DoubleProperty = 2.5d
16+
};
17+
18+
// Serialize message using PascalCase naming policy (default)
19+
var serializerOptions = new JsonSerializerOptions();
20+
serializerOptions.AddProtobufSupport();
21+
22+
var payload = JsonSerializer.Serialize(originalMessage, serializerOptions);
23+
24+
// Deserialize message using CamelCase naming policy (custom)
25+
// with PropertyNameCaseInsensitive option set to true
26+
var deserializerOptions = new JsonSerializerOptions();
27+
deserializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
28+
deserializerOptions.PropertyNameCaseInsensitive = true;
29+
deserializerOptions.AddProtobufSupport();
30+
31+
var deserialized = JsonSerializer.Deserialize<SimpleMessage>(payload, deserializerOptions);
32+
33+
deserialized.ShouldBeEquivalentTo(originalMessage);
34+
}
35+
}

0 commit comments

Comments
 (0)