diff --git a/src/JsonApiDotNetCore/Configuration/JsonApiOptions.cs b/src/JsonApiDotNetCore/Configuration/JsonApiOptions.cs index 3d169998a3..58d1a33376 100644 --- a/src/JsonApiDotNetCore/Configuration/JsonApiOptions.cs +++ b/src/JsonApiDotNetCore/Configuration/JsonApiOptions.cs @@ -3,6 +3,7 @@ using JsonApiDotNetCore.Internal; using JsonApiDotNetCore.Serialization; using Microsoft.EntityFrameworkCore; +using Newtonsoft.Json; using Newtonsoft.Json.Serialization; namespace JsonApiDotNetCore.Configuration @@ -21,10 +22,20 @@ public class JsonApiOptions /// of the v1 spec. However, we have decided that this is a real /// requirement for users of this library and a gap in the specification. /// It will likely be removed when the spec is updated to support this - /// requirement. + /// requirement. /// public bool AllowCustomQueryParameters { get; set; } - public IContractResolver JsonContractResolver { get; set; } = new DasherizedResolver(); + [Obsolete("JsonContract resolver can now be set on SerializerSettings.")] + public IContractResolver JsonContractResolver + { + get => SerializerSettings.ContractResolver; + set => SerializerSettings.ContractResolver = value; + } + public JsonSerializerSettings SerializerSettings { get; } = new JsonSerializerSettings() + { + NullValueHandling = NullValueHandling.Ignore, + ContractResolver = new DasherizedResolver() + }; internal IContextGraphBuilder ContextGraphBuilder { get; } = new ContextGraphBuilder(); public void BuildContextGraph(Action builder) diff --git a/src/JsonApiDotNetCore/Serialization/JsonApiDeSerializer.cs b/src/JsonApiDotNetCore/Serialization/JsonApiDeSerializer.cs index 608a23b66e..d8cbf245bf 100644 --- a/src/JsonApiDotNetCore/Serialization/JsonApiDeSerializer.cs +++ b/src/JsonApiDotNetCore/Serialization/JsonApiDeSerializer.cs @@ -135,12 +135,7 @@ private object ConvertAttrValue(object newValue, Type targetType) private object DeserializeComplexType(JContainer obj, Type targetType) { - var serializerSettings = new JsonSerializerSettings - { - ContractResolver = _jsonApiContext.Options.JsonContractResolver - }; - - return obj.ToObject(targetType, JsonSerializer.Create(serializerSettings)); + return obj.ToObject(targetType, JsonSerializer.Create(_jsonApiContext.Options.SerializerSettings)); } private object SetRelationships( @@ -223,4 +218,4 @@ private object SetHasManyRelationship(object entity, return entity; } } -} +} \ No newline at end of file diff --git a/src/JsonApiDotNetCore/Serialization/JsonApiSerializer.cs b/src/JsonApiDotNetCore/Serialization/JsonApiSerializer.cs index a7e14341b0..8e94835266 100644 --- a/src/JsonApiDotNetCore/Serialization/JsonApiSerializer.cs +++ b/src/JsonApiDotNetCore/Serialization/JsonApiSerializer.cs @@ -19,12 +19,12 @@ public JsonApiSerializer( IDocumentBuilder documentBuilder) { _jsonApiContext = jsonApiContext; - _documentBuilder = documentBuilder; + _documentBuilder = documentBuilder; } public JsonApiSerializer( IJsonApiContext jsonApiContext, - IDocumentBuilder documentBuilder, + IDocumentBuilder documentBuilder, ILoggerFactory loggerFactory) { _jsonApiContext = jsonApiContext; @@ -43,7 +43,7 @@ public string Serialize(object entity) if (entity is IEnumerable) return SerializeDocuments(entity); - return SerializeDocument(entity); + return SerializeDocument(entity); } private string GetNullDataResponse() @@ -83,10 +83,7 @@ private string SerializeDocument(object entity) private string _serialize(object obj) { - return JsonConvert.SerializeObject(obj, new JsonSerializerSettings { - NullValueHandling = NullValueHandling.Ignore, - ContractResolver = _jsonApiContext.Options.JsonContractResolver - }); + return JsonConvert.SerializeObject(obj, _jsonApiContext.Options.SerializerSettings); } } -} +} \ No newline at end of file diff --git a/test/UnitTests/Serialization/JsonApiDeSerializerTests.cs b/test/UnitTests/Serialization/JsonApiDeSerializerTests.cs index 53edc9faad..3e54c7b393 100644 --- a/test/UnitTests/Serialization/JsonApiDeSerializerTests.cs +++ b/test/UnitTests/Serialization/JsonApiDeSerializerTests.cs @@ -26,10 +26,10 @@ public void Can_Deserialize_Complex_Types() jsonApiContextMock.SetupAllProperties(); jsonApiContextMock.Setup(m => m.ContextGraph).Returns(contextGraph); jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary()); - jsonApiContextMock.Setup(m => m.Options).Returns(new JsonApiOptions - { - JsonContractResolver = new CamelCasePropertyNamesContractResolver() - }); + + var jsonApiOptions = new JsonApiOptions(); + jsonApiOptions.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); + jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions); var genericProcessorFactoryMock = new Mock(); @@ -69,10 +69,9 @@ public void Can_Deserialize_Complex_List_Types() jsonApiContextMock.SetupAllProperties(); jsonApiContextMock.Setup(m => m.ContextGraph).Returns(contextGraph); jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary()); - jsonApiContextMock.Setup(m => m.Options).Returns(new JsonApiOptions - { - JsonContractResolver = new CamelCasePropertyNamesContractResolver() - }); + var jsonApiOptions = new JsonApiOptions(); + jsonApiOptions.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); + jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions); var genericProcessorFactoryMock = new Mock(); @@ -116,10 +115,9 @@ public void Can_Deserialize_Complex_Types_With_Dasherized_Attrs() jsonApiContextMock.Setup(m => m.ContextGraph).Returns(contextGraph); jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary()); - jsonApiContextMock.Setup(m => m.Options).Returns(new JsonApiOptions - { - JsonContractResolver = new DasherizedResolver() // <--- - }); + var jsonApiOptions = new JsonApiOptions(); + jsonApiOptions.SerializerSettings.ContractResolver = new DasherizedResolver(); // <-- + jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions); var genericProcessorFactoryMock = new Mock(); @@ -162,10 +160,9 @@ public void Immutable_Attrs_Are_Not_Included_In_AttributesToUpdate() jsonApiContextMock.Setup(m => m.ContextGraph).Returns(contextGraph); jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(attributesToUpdate); - jsonApiContextMock.Setup(m => m.Options).Returns(new JsonApiOptions - { - JsonContractResolver = new DasherizedResolver() - }); + var jsonApiOptions = new JsonApiOptions(); + jsonApiOptions.SerializerSettings.ContractResolver = new DasherizedResolver(); + jsonApiContextMock.Setup(m => m.Options).Returns(jsonApiOptions); var genericProcessorFactoryMock = new Mock(); @@ -178,8 +175,8 @@ public void Immutable_Attrs_Are_Not_Included_In_AttributesToUpdate() Type = "test-resource", Id = "1", Attributes = new Dictionary { - { "complex-member", new Dictionary { - { "compound-name", "testName" } } + { "complex-member", new Dictionary { + { "compound-name", "testName" } } }, { "immutable", "value"} } @@ -194,8 +191,8 @@ public void Immutable_Attrs_Are_Not_Included_In_AttributesToUpdate() // assert Assert.NotNull(result.ComplexMember); Assert.Equal(1, attributesToUpdate.Count); - - foreach(var attr in attributesToUpdate) + + foreach (var attr in attributesToUpdate) Assert.False(attr.Key.IsImmutable); } diff --git a/test/UnitTests/Serialization/JsonApiSerializerTests.cs b/test/UnitTests/Serialization/JsonApiSerializerTests.cs index e671f3fc0c..3630cd6452 100644 --- a/test/UnitTests/Serialization/JsonApiSerializerTests.cs +++ b/test/UnitTests/Serialization/JsonApiSerializerTests.cs @@ -26,9 +26,7 @@ public void Can_Serialize_Complex_Types() var jsonApiContextMock = new Mock(); jsonApiContextMock.SetupAllProperties(); jsonApiContextMock.Setup(m => m.ContextGraph).Returns(contextGraph); - jsonApiContextMock.Setup(m => m.Options).Returns(new JsonApiOptions { - JsonContractResolver = new DasherizedResolver() - }); + jsonApiContextMock.Setup(m => m.Options).Returns(new JsonApiOptions()); jsonApiContextMock.Setup(m => m.RequestEntity) .Returns(contextGraph.GetContextEntity("test-resource")); jsonApiContextMock.Setup(m => m.MetaBuilder).Returns(new MetaBuilder()); @@ -36,8 +34,10 @@ public void Can_Serialize_Complex_Types() var documentBuilder = new DocumentBuilder(jsonApiContextMock.Object); var serializer = new JsonApiSerializer(jsonApiContextMock.Object, documentBuilder); - var resource = new TestResource { - ComplexMember = new ComplexType { + var resource = new TestResource + { + ComplexMember = new ComplexType + { CompoundName = "testname" } };