Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion src/StronglyTypedIds.Templates/int-full.typedid
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,20 @@
public partial class PLACEHOLDERIDSystemTextJsonConverter : global::System.Text.Json.Serialization.JsonConverter<PLACEHOLDERID>
{
public override PLACEHOLDERID Read(ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options)
=> new (reader.GetInt32());
{
#if NET6_0_OR_GREATER
if (options.NumberHandling.HasFlag(global::System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString) && reader.TokenType == global::System.Text.Json.JsonTokenType.String)
{
var str = reader.GetString();

if (!string.IsNullOrEmpty(str) && PLACEHOLDERID.TryParse(str, null, out var val))
return val;

return default;
}
#endif
return new PLACEHOLDERID(reader.GetInt32());
}

public override void Write(global::System.Text.Json.Utf8JsonWriter writer, PLACEHOLDERID value, global::System.Text.Json.JsonSerializerOptions options)
=> writer.WriteNumberValue(value.Value);
Expand Down
15 changes: 14 additions & 1 deletion src/StronglyTypedIds.Templates/long-full.typedid
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,20 @@
public partial class PLACEHOLDERIDSystemTextJsonConverter : global::System.Text.Json.Serialization.JsonConverter<PLACEHOLDERID>
{
public override PLACEHOLDERID Read(ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options)
=> new (reader.GetInt32());
{
#if NET6_0_OR_GREATER
if (options.NumberHandling.HasFlag(global::System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString) && reader.TokenType == global::System.Text.Json.JsonTokenType.String)
{
var str = reader.GetString();

if (!string.IsNullOrEmpty(str) && PLACEHOLDERID.TryParse(str, null, out var val))
return val;

return default;
}
#endif
return new PLACEHOLDERID(reader.GetInt64());
}

public override void Write(global::System.Text.Json.Utf8JsonWriter writer, PLACEHOLDERID value, global::System.Text.Json.JsonSerializerOptions options)
=> writer.WriteNumberValue(value.Value);
Expand Down
15 changes: 14 additions & 1 deletion src/StronglyTypedIds/EmbeddedSources.Int.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,20 @@ public override bool CanConvertTo(global::System.ComponentModel.ITypeDescriptorC
public partial class PLACEHOLDERIDSystemTextJsonConverter : global::System.Text.Json.Serialization.JsonConverter<PLACEHOLDERID>
{
public override PLACEHOLDERID Read(ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options)
=> new (reader.GetInt32());
{
#if NET6_0_OR_GREATER
if (options.NumberHandling.HasFlag(global::System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString) && reader.TokenType == global::System.Text.Json.JsonTokenType.String)
{
var str = reader.GetString();

if (!string.IsNullOrEmpty(str) && PLACEHOLDERID.TryParse(str, null, out var val))
return val;

return default;
}
#endif
return new PLACEHOLDERID(reader.GetInt32());
}

public override void Write(global::System.Text.Json.Utf8JsonWriter writer, PLACEHOLDERID value, global::System.Text.Json.JsonSerializerOptions options)
=> writer.WriteNumberValue(value.Value);
Expand Down
15 changes: 14 additions & 1 deletion src/StronglyTypedIds/EmbeddedSources.Long.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,20 @@ public override bool CanConvertTo(global::System.ComponentModel.ITypeDescriptorC
public partial class PLACEHOLDERIDSystemTextJsonConverter : global::System.Text.Json.Serialization.JsonConverter<PLACEHOLDERID>
{
public override PLACEHOLDERID Read(ref global::System.Text.Json.Utf8JsonReader reader, global::System.Type typeToConvert, global::System.Text.Json.JsonSerializerOptions options)
=> new (reader.GetInt64());
{
#if NET6_0_OR_GREATER
if (options.NumberHandling.HasFlag(global::System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString) && reader.TokenType == global::System.Text.Json.JsonTokenType.String)
{
var str = reader.GetString();

if (!string.IsNullOrEmpty(str) && PLACEHOLDERID.TryParse(str, null, out var val))
return val;

return default;
}
#endif
return new PLACEHOLDERID(reader.GetInt64());
}

public override void Write(global::System.Text.Json.Utf8JsonWriter writer, PLACEHOLDERID value, global::System.Text.Json.JsonSerializerOptions options)
=> writer.WriteNumberValue(value.Value);
Expand Down
34 changes: 33 additions & 1 deletion test/StronglyTypedIds.IntegrationTests/IntIdTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,14 +120,41 @@ public void CanDeserializeDictionaryKeys_WithSystemTextJsonProvider()
}
}
""";
Assert.Equal(serialized, expected);
Assert.Equal(expected, serialized);

var deserialized = SystemTextJsonSerializer.Deserialize<TypeWithDictionaryKeys>(serialized, opts);

Assert.NotNull(deserialized.Values);
Assert.True(deserialized.Values.ContainsKey(key));
Assert.Equal("My Value", deserialized.Values[key]);
}

[Fact]
public void CanDeserializeWhenIntIsStoredAsAString_WithSystemTextJsonProvider()
{
var opts = new JsonSerializerOptions
{
WriteIndented = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
NumberHandling = JsonNumberHandling.AllowReadingFromString,
};

var key = "My Key";

var serialized = $$"""
{
"values": {
"My Key": "123"
}
}
""";

var deserialized = SystemTextJsonSerializer.Deserialize<DictionaryWithTypeValue>(serialized, opts);

Assert.NotNull(deserialized.Values);
Assert.True(deserialized.Values.ContainsKey(key));
Assert.Equal(new IntId(123), deserialized.Values[key]);
}
#endif

[Fact]
Expand Down Expand Up @@ -589,6 +616,11 @@ internal class TypeWithDictionaryKeys
public Dictionary<IntId, string> Values { get; set; }
}

internal class DictionaryWithTypeValue
{
public Dictionary<string, IntId> Values { get; set; }
}

internal record ToSerialize
{
public ConvertersIntId Id { get; set; }
Expand Down
34 changes: 33 additions & 1 deletion test/StronglyTypedIds.IntegrationTests/LongIdTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,14 +119,41 @@ public void CanDeserializeDictionaryKeys_WithSystemTextJsonProvider()
}
}
""";
Assert.Equal(serialized, expected);
Assert.Equal(expected, serialized);

var deserialized = SystemTextJsonSerializer.Deserialize<TypeWithDictionaryKeys>(serialized, opts);

Assert.NotNull(deserialized.Values);
Assert.True(deserialized.Values.ContainsKey(key));
Assert.Equal("My Value", deserialized.Values[key]);
}

[Fact]
public void CanDeserializeWhenLongIsStoredAsAString_WithSystemTextJsonProvider()
{
var opts = new JsonSerializerOptions
{
WriteIndented = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
NumberHandling = JsonNumberHandling.AllowReadingFromString,
};

var key = "My Key";

var serialized = $$"""
{
"values": {
"My Key": "123"
}
}
""";

var deserialized = SystemTextJsonSerializer.Deserialize<DictionaryWithTypeValue>(serialized, opts);

Assert.NotNull(deserialized.Values);
Assert.True(deserialized.Values.ContainsKey(key));
Assert.Equal(new LongId(123), deserialized.Values[key]);
}
#endif

[Fact]
Expand Down Expand Up @@ -571,6 +598,11 @@ internal class TypeWithDictionaryKeys
public Dictionary<LongId, string> Values { get; set; }
}

internal class DictionaryWithTypeValue
{
public Dictionary<string, LongId> Values { get; set; }
}

internal record ToSerialize
{
public ConvertersLongId Id { get; set; }
Expand Down
Loading