Skip to content

Commit 39443d6

Browse files
committed
fix
1 parent 18283d5 commit 39443d6

File tree

5 files changed

+106
-110
lines changed

5 files changed

+106
-110
lines changed

src/CommandQuery.SystemTextJson/Internal/DictionaryExtensions.cs

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,52 @@
11
using System.Text.Json;
2+
using System.Text.Json.Serialization;
23

34
namespace CommandQuery.SystemTextJson
45
{
56
internal static class JsonExtensions
67
{
7-
internal static object? SafeDeserialize(this string json, Type type, JsonSerializerOptions? options)
8+
private static readonly JsonSerializerOptions _options = GetJsonSerializerOptions();
9+
10+
internal static object? SafeDeserialize(this string json, Type type, JsonSerializerOptions? options = null)
11+
{
12+
try
13+
{
14+
return JsonSerializer.Deserialize(json, type, options ?? _options);
15+
}
16+
catch
17+
{
18+
return null;
19+
}
20+
}
21+
22+
internal static object? SafeDeserialize(this IDictionary<string, object>? dictionary, Type type)
823
{
24+
if (dictionary is null)
25+
{
26+
return null;
27+
}
28+
929
try
1030
{
11-
return JsonSerializer.Deserialize(json, type, options);
31+
return JsonSerializer.Deserialize(JsonSerializer.Serialize(dictionary), type, _options);
1232
}
1333
catch
1434
{
1535
return null;
1636
}
1737
}
38+
39+
private static JsonSerializerOptions GetJsonSerializerOptions()
40+
{
41+
var result = new JsonSerializerOptions
42+
{
43+
PropertyNameCaseInsensitive = true,
44+
NumberHandling = JsonNumberHandling.AllowReadingFromString,
45+
};
46+
result.Converters.Add(new JsonStringEnumConverter());
47+
result.Converters.Add(new BooleanConverter());
48+
49+
return result;
50+
}
1851
}
1952
}

tests/CommandQuery.Benchmark/JsonBenchmarks.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ public void GlobalSetup()
4343
// SystemTextJson
4444

4545
[Benchmark]
46-
public object SystemTextJson_JsonExtensions_SafeDeserialize() => SystemTextJson.JsonExtensions.SafeDeserialize(_systemTextJsonString, typeof(FakeComplexObject), null);
46+
public object SystemTextJson_string_SafeDeserialize() => SystemTextJson.JsonExtensions.SafeDeserialize(_systemTextJsonString, typeof(FakeComplexObject), null);
4747

4848
[Benchmark]
49-
public object SystemTextJson_DictionaryExtensions_SafeDeserialize() => SystemTextJson.DictionaryExtensions.SafeDeserialize(_dictionary, typeof(FakeComplexObject));
49+
public object SystemTextJson_Dictionary_SafeDeserialize() => SystemTextJson.JsonExtensions.SafeDeserialize(_dictionary, typeof(FakeComplexObject));
5050
}
5151

5252
public class FakeComplexObject

tests/CommandQuery.Tests/SystemTextJson/Internal/DictionaryExtensionsTests.cs

Lines changed: 0 additions & 60 deletions
This file was deleted.

tests/CommandQuery.Tests/SystemTextJson/Internal/JsonExtensionsTests.cs

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,89 @@ namespace CommandQuery.Tests.SystemTextJson.Internal
99
public class JsonExtensionsTests
1010
{
1111
[LoFu, Test]
12-
public void SafeDeserialize()
12+
public void SafeDeserialize_string()
1313
{
1414
void should_return_an_object()
1515
{
16-
"{}".SafeDeserialize(typeof(object), null).Should().NotBeNull();
16+
"{}".SafeDeserialize(typeof(object)).Should().NotBeNull();
1717

1818
JsonSerializer.Serialize(TestData.FakeComplexQuery)
19-
.SafeDeserialize(typeof(FakeComplexQuery), null)
19+
.SafeDeserialize(typeof(FakeComplexQuery))
2020
.Should().BeEquivalentTo(TestData.FakeComplexQuery);
2121

2222
JsonSerializer.Serialize(TestData.FakeDateTimeQuery)
23-
.SafeDeserialize(typeof(FakeDateTimeQuery), null)
23+
.SafeDeserialize(typeof(FakeDateTimeQuery))
2424
.Should().BeEquivalentTo(TestData.FakeDateTimeQuery);
2525

2626
JsonSerializer.Serialize(TestData.FakeNestedQuery)
27-
.SafeDeserialize(typeof(FakeNestedQuery), null)
27+
.SafeDeserialize(typeof(FakeNestedQuery))
2828
.Should().BeEquivalentTo(TestData.FakeNestedQuery);
2929
}
3030

31-
void should_return_null_if_deserialization_fails() => ((string)null).SafeDeserialize(typeof(object), null).Should().BeNull();
31+
void should_have_sane_defaults()
32+
{
33+
var result = "{\"int32\":\"1\"}".SafeDeserialize(typeof(FakeComplexQuery)) as FakeComplexQuery;
34+
result.Int32.Should().Be(1);
35+
}
36+
37+
void should_use_options_when_provided()
38+
{
39+
var options = new JsonSerializerOptions(JsonSerializerDefaults.Web);
40+
var result = "{\"int32\":\"1\"}".SafeDeserialize(typeof(FakeComplexQuery), options) as FakeComplexQuery;
41+
result.Int32.Should().Be(1);
42+
}
43+
44+
void should_return_null_if_deserialization_fails() => ((string)null).SafeDeserialize(typeof(object)).Should().BeNull();
45+
}
46+
47+
[LoFu, Test]
48+
public void SafeDeserialize_Dictionary()
49+
{
50+
void should_set_the_property_values()
51+
{
52+
var subject = TestData.FakeComplexQuery_As_Dictionary_Of_String_Object;
53+
var result = subject.SafeDeserialize(typeof(FakeComplexQuery)) as FakeComplexQuery;
54+
result.Should().BeEquivalentTo(TestData.FakeComplexQuery);
55+
56+
subject = TestData.FakeComplexQuery_As_Dictionary_Of_String_Object.ToDictionary(x => x.Key.ToLower(), x => x.Value);
57+
result = subject.SafeDeserialize(typeof(FakeComplexQuery)) as FakeComplexQuery;
58+
result.Should().BeEquivalentTo(TestData.FakeComplexQuery);
59+
}
60+
61+
void should_set_the_property_values_of_DateTime_kinds()
62+
{
63+
var subject = TestData.FakeDateTimeQuery_As_Dictionary_Of_String_Object;
64+
65+
var result = subject.SafeDeserialize(typeof(FakeDateTimeQuery)) as FakeDateTimeQuery;
66+
67+
result.Should().BeEquivalentTo(TestData.FakeDateTimeQuery);
68+
}
69+
70+
void should_not_set_the_property_values_of_nested_objects()
71+
{
72+
var subject = TestData.FakeNestedQuery_As_Dictionary_Of_String_Object;
73+
74+
var result = subject.SafeDeserialize(typeof(FakeNestedQuery)) as FakeNestedQuery;
75+
76+
result.Should().BeEquivalentTo(TestData.FakeNestedQuery);
77+
}
78+
79+
void should_return_null_if_dictionary_is_null()
80+
{
81+
IDictionary<string, object> subject = null;
82+
83+
subject.SafeDeserialize(typeof(FakeComplexQuery)).Should().BeNull();
84+
}
85+
86+
void should_return_null_if_conversion_fails()
87+
{
88+
var subject = new Dictionary<string, object>
89+
{
90+
{ "Guid", "fail" }
91+
};
92+
93+
subject.SafeDeserialize(typeof(FakeComplexQuery)).Should().BeNull();
94+
}
3295
}
3396
}
3497
}

0 commit comments

Comments
 (0)