diff --git a/Directory.Build.props b/Directory.Build.props
index 996cc43..0e3677a 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -4,7 +4,7 @@
- 0.4.0-preview-01
+ 0.4.0-preview-02
Stef Heyenrath
11
enable
diff --git a/src/AnyOf.Newtonsoft.Json/AnyOf.Newtonsoft.Json.csproj b/src/AnyOf.Newtonsoft.Json/AnyOf.Newtonsoft.Json.csproj
index eb2aba5..5390154 100644
--- a/src/AnyOf.Newtonsoft.Json/AnyOf.Newtonsoft.Json.csproj
+++ b/src/AnyOf.Newtonsoft.Json/AnyOf.Newtonsoft.Json.csproj
@@ -2,17 +2,15 @@
AnyOf.Newtonsoft.Json
- net45;netstandard1.3;netstandard2.0;netstandard2.1
+ net45;netstandard1.3;netstandard2.0;netstandard2.1;netcoreapp3.1;net6.0;net7.0
{31D0104F-3E63-4223-A4AD-372E68A6B0CB}
Contains an AnyOfJsonConverter which can be used to serialize and deserialize an AnyOf<TFirst, TSecond, ...> type.
AnyOf;types;AnyOfJsonConverter;JsonConverter;json;Newtonsoft
AnyOfTypes.Newtonsoft.Json
+ 11
+ enable
-
-
-
-
diff --git a/src/AnyOf.Newtonsoft.Json/AnyOfJsonConverter.cs b/src/AnyOf.Newtonsoft.Json/AnyOfJsonConverter.cs
index 73eea9a..bc195ae 100644
--- a/src/AnyOf.Newtonsoft.Json/AnyOfJsonConverter.cs
+++ b/src/AnyOf.Newtonsoft.Json/AnyOfJsonConverter.cs
@@ -5,7 +5,7 @@
using System.Reflection;
using AnyOfTypes.System.Text.Json.Extensions;
using AnyOfTypes.System.Text.Json.Matcher;
-using AnyOfTypes.System.Text.Json.Matcher.Models;
+using AnyOfTypes.System.Text.Json.Models;
using Nelibur.ObjectMapper;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -187,10 +187,8 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
{
var target = Activator.CreateInstance(bestType);
- using (JsonReader jObjectReader = CopyReaderForObject(reader, jObject))
- {
- serializer.Populate(jObjectReader, target);
- }
+ using JsonReader jObjectReader = CopyReaderForObject(reader, jObject);
+ serializer.Populate(jObjectReader, target);
return target;
}
@@ -200,7 +198,7 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
public override bool CanConvert(Type objectType)
{
- return objectType.FullName.StartsWith("AnyOfTypes.AnyOf`");
+ return objectType.FullName?.StartsWith("AnyOfTypes.AnyOf`") == true;
}
private static JsonReader CopyReaderForObject(JsonReader reader, JObject jObject)
diff --git a/src/AnyOf.System.Text.Json/AnyOf.System.Text.Json.csproj b/src/AnyOf.System.Text.Json/AnyOf.System.Text.Json.csproj
index f657327..5d28ee3 100644
--- a/src/AnyOf.System.Text.Json/AnyOf.System.Text.Json.csproj
+++ b/src/AnyOf.System.Text.Json/AnyOf.System.Text.Json.csproj
@@ -2,11 +2,13 @@
AnyOf.System.Text.Json
- netstandard2.0;net50;netcoreapp3.1
+ netstandard2.0;netcoreapp3.1;net6.0;net7.0
{41D0104F-3E63-4223-A4AD-372E68A6B0CB}
Contains an AnyOfJsonConverter which can be used to serialize and deserialize an AnyOf<TFirst, TSecond, ...> type.
AnyOf;types;AnyOfJsonConverter;JsonConverter;json
AnyOfTypes.System.Text.Json
+ 11
+ enable
diff --git a/src/AnyOf.System.Text.Json/AnyOfJsonConverter.cs b/src/AnyOf.System.Text.Json/AnyOfJsonConverter.cs
index b041a41..727128a 100644
--- a/src/AnyOf.System.Text.Json/AnyOfJsonConverter.cs
+++ b/src/AnyOf.System.Text.Json/AnyOfJsonConverter.cs
@@ -6,231 +6,231 @@
using System.Text.Json.Serialization;
using AnyOfTypes.System.Text.Json.Extensions;
using AnyOfTypes.System.Text.Json.Matcher;
-using AnyOfTypes.System.Text.Json.Matcher.Models;
+using AnyOfTypes.System.Text.Json.Models;
using Nelibur.ObjectMapper;
-namespace AnyOfTypes.System.Text.Json
+namespace AnyOfTypes.System.Text.Json;
+
+public class AnyOfJsonConverter : JsonConverter
+
+
+
+
diff --git a/tests/AnyOf.Newtonsoft.Json.Tests/AnyOfJsonConverterTests.cs b/tests/AnyOf.Newtonsoft.Json.Tests/AnyOfJsonConverterTests.cs
index 868dc85..0d2c978 100644
--- a/tests/AnyOf.Newtonsoft.Json.Tests/AnyOfJsonConverterTests.cs
+++ b/tests/AnyOf.Newtonsoft.Json.Tests/AnyOfJsonConverterTests.cs
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using AnyOf.System.Text.Json.Tests.TestModels;
+using AnyOfTypes;
using AnyOfTypes.Newtonsoft.Json;
using FluentAssertions;
using Newtonsoft.Json;
@@ -103,6 +104,31 @@ public void Serialize_AnyOf_With_MixedTypes()
json.Should().Be("{\"IntOrStringOrAOrB\":1}");
}
+ [Fact]
+ public void Deserialize_Issue17()
+ {
+ // Arrange
+ var expected = new ATest
+ {
+ StringValue = "1",
+ SubClass = new SampleSubClassTest
+ {
+ SampleProperty = "Abc"
+ }
+ };
+
+ var options = new JsonSerializerSettings();
+ options.Converters.Add(new AnyOfJsonConverter());
+
+ var json = "{\"StringValue\": \"1\",\"SubClass\": {\"SampleProperty\": \"Abc\"}}";
+
+ // Act
+ var result = JsonConvert.DeserializeObject>(json, options);
+
+ // Assert
+ result.First.Should().BeEquivalentTo(expected);
+ }
+
[Fact]
public void Deserialize_AnyOf_With_SimpleTypes()
{
diff --git a/src/AnyOf.Newtonsoft.Json/Class1.cs b/tests/AnyOf.Newtonsoft.Json.Tests/Class1.cs
similarity index 100%
rename from src/AnyOf.Newtonsoft.Json/Class1.cs
rename to tests/AnyOf.Newtonsoft.Json.Tests/Class1.cs
diff --git a/tests/AnyOf.System.Text.Json.Tests/AnyOf.System.Text.Json.Tests.csproj b/tests/AnyOf.System.Text.Json.Tests/AnyOf.System.Text.Json.Tests.csproj
index 71a1aad..65bda92 100644
--- a/tests/AnyOf.System.Text.Json.Tests/AnyOf.System.Text.Json.Tests.csproj
+++ b/tests/AnyOf.System.Text.Json.Tests/AnyOf.System.Text.Json.Tests.csproj
@@ -3,6 +3,7 @@
net7.0
false
+ 11
diff --git a/tests/AnyOf.System.Text.Json.Tests/AnyOfJsonConverterTests.cs b/tests/AnyOf.System.Text.Json.Tests/AnyOfJsonConverterTests.cs
index aa3aa64..88e3806 100644
--- a/tests/AnyOf.System.Text.Json.Tests/AnyOfJsonConverterTests.cs
+++ b/tests/AnyOf.System.Text.Json.Tests/AnyOfJsonConverterTests.cs
@@ -1,243 +1,270 @@
using System.Collections.Generic;
using System.Text.Json;
using AnyOf.System.Text.Json.Tests.TestModels;
+using AnyOfTypes;
using AnyOfTypes.System.Text.Json;
using FluentAssertions;
using Xunit;
-namespace AnyOf.System.Text.Json.Tests
+namespace AnyOf.System.Text.Json.Tests;
+
+public class AnyOfJsonConverterTests
{
- public class AnyOfJsonConverterTests
+ [Fact]
+ public void Serialize_AnyOf_With_SimpleTypes()
{
- [Fact]
- public void Serialize_AnyOf_With_SimpleTypes()
+ // Arrange
+ var test = new TestSimpleTypes
{
- // Arrange
- var test = new TestSimpleTypes
- {
- IntOrString = 1
- };
+ IntOrString = 1
+ };
- // Act
- var options = new JsonSerializerOptions
- {
- WriteIndented = false
- };
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions
+ {
+ WriteIndented = false
+ };
+ options.Converters.Add(new AnyOfJsonConverter());
- var json = JsonSerializer.Serialize(test, options);
+ var json = JsonSerializer.Serialize(test, options);
- // Assert
- json.Should().Be("{\"IntOrString\":1}");
- }
+ // Assert
+ json.Should().Be("{\"IntOrString\":1}");
+ }
- [Fact]
- public void Serialize_AnyOf_With_ComplexTypes()
+ [Fact]
+ public void Serialize_AnyOf_With_ComplexTypes()
+ {
+ // Arrange
+ var test = new TestComplexTypes
{
- // Arrange
- var test = new TestComplexTypes
+ AorB = new A
{
- AorB = new A
- {
- Id = 1
- }
- };
+ Id = 1
+ }
+ };
- // Act
- var options = new JsonSerializerOptions
- {
- WriteIndented = false
- };
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions
+ {
+ WriteIndented = false
+ };
+ options.Converters.Add(new AnyOfJsonConverter());
- var json = JsonSerializer.Serialize(test, options);
+ var json = JsonSerializer.Serialize(test, options);
- // Assert
- json.Should().Be("{\"AorB\":{\"Id\":1}}");
- }
+ // Assert
+ json.Should().Be("{\"AorB\":{\"Id\":1}}");
+ }
- [Fact]
- public void Serialize_AnyOf_With_MixedTypes()
+ [Fact]
+ public void Serialize_AnyOf_With_MixedTypes()
+ {
+ // Arrange
+ var test = new TestMixedTypes
{
- // Arrange
- var test = new TestMixedTypes
- {
- IntOrStringOrAOrB = 1
- };
+ IntOrStringOrAOrB = 1
+ };
- // Act
- var options = new JsonSerializerOptions
- {
- WriteIndented = false
- };
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions
+ {
+ WriteIndented = false
+ };
+ options.Converters.Add(new AnyOfJsonConverter());
- var json = JsonSerializer.Serialize(test, options);
+ var json = JsonSerializer.Serialize(test, options);
- // Assert
- json.Should().Be("{\"IntOrStringOrAOrB\":1}");
- }
+ // Assert
+ json.Should().Be("{\"IntOrStringOrAOrB\":1}");
+ }
- [Fact]
- public void Serialize_AnyOf_With_IntArray()
+ [Fact]
+ public void Serialize_AnyOf_With_IntArray()
+ {
+ // Arrange
+ var test = new TestComplexArray
{
- // Arrange
- var test = new TestComplexArray
- {
- X = new int[] { 42 }
- };
+ X = new int[] { 42 }
+ };
- // Act
- var options = new JsonSerializerOptions
- {
- WriteIndented = false
- };
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions
+ {
+ WriteIndented = false
+ };
+ options.Converters.Add(new AnyOfJsonConverter());
- var json = JsonSerializer.Serialize(test, options);
+ var json = JsonSerializer.Serialize(test, options);
- // Assert
- json.Should().Be("{\"X\":[42]}");
- }
+ // Assert
+ json.Should().Be("{\"X\":[42]}");
+ }
- [Fact]
- public void Serialize_AnyOf_With_ObjectList()
+ [Fact]
+ public void Serialize_AnyOf_With_ObjectList()
+ {
+ // Arrange
+ var test = new TestComplexArray
{
- // Arrange
- var test = new TestComplexArray
- {
- X = new List { new A { Id = 1 }, new A { Id = 2 } }
- };
+ X = new List { new A { Id = 1 }, new A { Id = 2 } }
+ };
- // Act
- var options = new JsonSerializerOptions
- {
- WriteIndented = false
- };
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions
+ {
+ WriteIndented = false
+ };
+ options.Converters.Add(new AnyOfJsonConverter());
- var json = JsonSerializer.Serialize(test, options);
+ var json = JsonSerializer.Serialize(test, options);
- // Assert
- json.Should().Be("{\"X\":[{\"Id\":1},{\"Id\":2}]}");
- }
+ // Assert
+ json.Should().Be("{\"X\":[{\"Id\":1},{\"Id\":2}]}");
+ }
- [Fact]
- public void Deserialize_AnyOf_With_SimpleTypes()
+ [Fact]
+ public void Deserialize_Issue17()
+ {
+ // Arrange
+ var expected = new ATest
{
- // Arrange
- var expected = new TestSimpleTypes
+ StringValue = "1",
+ SubClass = new SampleSubClassTest
{
- IntOrString = 1
- };
+ SampleProperty = "Abc"
+ }
+ };
- // Act
- var options = new JsonSerializerOptions();
- options.Converters.Add(new AnyOfJsonConverter());
+ var options = new JsonSerializerOptions();
+ options.Converters.Add(new AnyOfJsonConverter());
+ options.PropertyNameCaseInsensitive = true;
- var result = JsonSerializer.Deserialize("{\"IntOrString\":1}", options);
+ var json = "{\"StringValue\": \"1\",\"SubClass\": {\"SampleProperty\": \"Abc\"}}";
- // Assert
- result.Should().BeEquivalentTo(expected);
- }
+ // Act
+ var result = JsonSerializer.Deserialize>(json, options);
+
+ // Assert
+ result.First.Should().BeEquivalentTo(expected);
+ }
- [Fact]
- public void Deserialize_AnyOf_With_ComplexTypes()
+ [Fact]
+ public void Deserialize_AnyOf_With_SimpleTypes()
+ {
+ // Arrange
+ var expected = new TestSimpleTypes
{
- // Arrange
- var expected = new A
- {
- Id = 1
- };
+ IntOrString = 1
+ };
- // Act
- var options = new JsonSerializerOptions();
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions();
+ options.Converters.Add(new AnyOfJsonConverter());
- var result = JsonSerializer.Deserialize("{\"AorB\":{\"Id\":1}}", options);
+ var result = JsonSerializer.Deserialize("{\"IntOrString\":1}", options);
- // Assert
- result.AorB.First.Should().BeEquivalentTo(expected);
- }
+ // Assert
+ result.Should().BeEquivalentTo(expected);
+ }
- [Fact]
- public void Deserialize_AnyOf_With_ComplexTypes_DifferentCasing()
+ [Fact]
+ public void Deserialize_AnyOf_With_ComplexTypes()
+ {
+ // Arrange
+ var expected = new A
{
- // Arrange
- var expected = new A2
- {
- id = 1
- };
+ Id = 1
+ };
- // Act
- var options = new JsonSerializerOptions
- {
- PropertyNameCaseInsensitive = true
- };
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions();
+ options.Converters.Add(new AnyOfJsonConverter());
- var result = JsonSerializer.Deserialize("{\"AorB\":{\"Id\":1}}", options);
+ var result = JsonSerializer.Deserialize("{\"AorB\":{\"Id\":1}}", options);
- // Assert
- result.AorB.First.Should().BeEquivalentTo(expected);
- }
+ // Assert
+ result.AorB.First.Should().BeEquivalentTo(expected);
+ }
- [Fact]
- public void Deserialize_AnyOf_With_MixedTypes()
+ [Fact]
+ public void Deserialize_AnyOf_With_ComplexTypes_DifferentCasing()
+ {
+ // Arrange
+ var expected = new A2
{
- // Arrange
- var expected = new TestMixedTypes
- {
- IntOrStringOrAOrB = 1
- };
+ id = 1
+ };
- // Act
- var options = new JsonSerializerOptions();
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions
+ {
+ PropertyNameCaseInsensitive = true
+ };
+ options.Converters.Add(new AnyOfJsonConverter());
- var result = JsonSerializer.Deserialize("{\"IntOrStringOrAOrB\":1}", options);
+ var result = JsonSerializer.Deserialize("{\"AorB\":{\"Id\":1}}", options);
- // Assert
- result.Should().BeEquivalentTo(expected);
- }
+ // Assert
+ result.AorB.First.Should().BeEquivalentTo(expected);
+ }
- [Fact]
- public void Deserialize_AnyOf_With_IntArray()
+ [Fact]
+ public void Deserialize_AnyOf_With_MixedTypes()
+ {
+ // Arrange
+ var expected = new TestMixedTypes
{
- // Arrange
- var expected = new int[] { 42 };
+ IntOrStringOrAOrB = 1
+ };
- // Act
- var options = new JsonSerializerOptions();
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions();
+ options.Converters.Add(new AnyOfJsonConverter());
- var result = JsonSerializer.Deserialize("{\"X\":[42]}", options);
+ var result = JsonSerializer.Deserialize("{\"IntOrStringOrAOrB\":1}", options);
- // Assert
- result.X.First.Should().BeEquivalentTo(expected);
- }
+ // Assert
+ result.Should().BeEquivalentTo(expected);
+ }
- [Fact]
- public void Deserialize_AnyOf_With_StringList()
- {
- // Arrange
- var expected = new[] { "a", "b" };
+ [Fact]
+ public void Deserialize_AnyOf_With_IntArray()
+ {
+ // Arrange
+ var expected = new int[] { 42 };
- // Act
- var options = new JsonSerializerOptions();
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions();
+ options.Converters.Add(new AnyOfJsonConverter());
- var result = JsonSerializer.Deserialize("{\"X\":[\"a\", \"b\"]}", options);
+ var result = JsonSerializer.Deserialize("{\"X\":[42]}", options);
- // Assert
- result.X.Second.Should().BeEquivalentTo(expected);
- }
+ // Assert
+ result.X.First.Should().BeEquivalentTo(expected);
+ }
- [Fact]
- public void Deserialize_AnyOf_With_ObjectList_A()
- {
- // Arrange
- var expected = new List
+ [Fact]
+ public void Deserialize_AnyOf_With_StringList()
+ {
+ // Arrange
+ var expected = new[] { "a", "b" };
+
+ // Act
+ var options = new JsonSerializerOptions();
+ options.Converters.Add(new AnyOfJsonConverter());
+
+ var result = JsonSerializer.Deserialize("{\"X\":[\"a\", \"b\"]}", options);
+
+ // Assert
+ result.X.Second.Should().BeEquivalentTo(expected);
+ }
+
+ [Fact]
+ public void Deserialize_AnyOf_With_ObjectList_A()
+ {
+ // Arrange
+ var expected = new List
{
new A
{
@@ -249,21 +276,21 @@ public void Deserialize_AnyOf_With_ObjectList_A()
}
};
- // Act
- var options = new JsonSerializerOptions();
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions();
+ options.Converters.Add(new AnyOfJsonConverter());
- var result = JsonSerializer.Deserialize("{\"X\":[{\"Id\":1},{\"Id\":2}]}", options);
+ var result = JsonSerializer.Deserialize("{\"X\":[{\"Id\":1},{\"Id\":2}]}", options);
- // Assert
- result.X.Third.Should().BeEquivalentTo(expected);
- }
+ // Assert
+ result.X.Third.Should().BeEquivalentTo(expected);
+ }
- [Fact]
- public void Deserialize_AnyOf_With_ObjectList_B()
- {
- // Arrange
- var expected = new List
+ [Fact]
+ public void Deserialize_AnyOf_With_ObjectList_B()
+ {
+ // Arrange
+ var expected = new List
{
new B
{
@@ -275,14 +302,13 @@ public void Deserialize_AnyOf_With_ObjectList_B()
}
};
- // Act
- var options = new JsonSerializerOptions();
- options.Converters.Add(new AnyOfJsonConverter());
+ // Act
+ var options = new JsonSerializerOptions();
+ options.Converters.Add(new AnyOfJsonConverter());
- var result = JsonSerializer.Deserialize("{\"X\":[{\"Guid\":\"a\"},{\"Guid\":\"b\"}]}", options);
+ var result = JsonSerializer.Deserialize("{\"X\":[{\"Guid\":\"a\"},{\"Guid\":\"b\"}]}", options);
- // Assert
- result.X.Fourth.Should().BeEquivalentTo(expected);
- }
+ // Assert
+ result.X.Fourth.Should().BeEquivalentTo(expected);
}
-}
\ No newline at end of file
+}
diff --git a/tests/AnyOf.System.Text.Json.Tests/TestModels/TestModels.cs b/tests/AnyOf.System.Text.Json.Tests/TestModels/TestModels.cs
index 55585d8..808d614 100644
--- a/tests/AnyOf.System.Text.Json.Tests/TestModels/TestModels.cs
+++ b/tests/AnyOf.System.Text.Json.Tests/TestModels/TestModels.cs
@@ -47,4 +47,21 @@ public class B
{
public string Guid { get; set; }
}
+
+ public class SampleSubClassTest
+ {
+ public string SampleProperty { get; set; }
+ }
+
+ class ATest
+ {
+ public SampleSubClassTest SubClass { get; set; }
+
+ public string StringValue { get; set; }
+ }
+
+ class BTest
+ {
+ public string Value { get; set; }
+ }
}
\ No newline at end of file
diff --git a/tests/AnyOfTests/AnyOfConverterTests.cs b/tests/AnyOfTests/AnyOfConverterTests.cs
index 628ae6a..e01371e 100644
--- a/tests/AnyOfTests/AnyOfConverterTests.cs
+++ b/tests/AnyOfTests/AnyOfConverterTests.cs
@@ -53,7 +53,22 @@ public void ConvertFrom_ShouldReturnExpectedValue(object value, object expectedV
var converter = new AnyOfConverter();
// Act
- var result = (AnyOf)converter.ConvertFrom(_typeDescriptorContext, null!, value);
+ var result = (AnyOf)converter.ConvertFrom(_typeDescriptorContext, null!, value)!;
+
+ // Assert
+ result.CurrentValue.Should().Be(expectedValue);
+ }
+
+ [Theory]
+ [InlineData(42, 42)]
+ [InlineData("foo", "foo")]
+ public void ConvertFrom_UsingTypeDescriptor_ShouldReturnExpectedValue(object value, object expectedValue)
+ {
+ // Arrange
+ var converter = TypeDescriptor.GetConverter(typeof(AnyOfConverter));
+
+ // Act
+ var result = (AnyOf)converter.ConvertFrom(_typeDescriptorContext, null!, value)!;
// Assert
result.CurrentValue.Should().Be(expectedValue);