Skip to content

Bugfix: Respect customizations on JsonSerializerSettings #688

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
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
5 changes: 4 additions & 1 deletion benchmarks/Serialization/JsonApiSerializerBenchmarks.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using BenchmarkDotNet.Attributes;
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Internal.Contracts;
using JsonApiDotNetCore.Managers;
using JsonApiDotNetCore.Query;
Expand All @@ -23,6 +24,8 @@ public class JsonApiSerializerBenchmarks

public JsonApiSerializerBenchmarks()
{
var options = new JsonApiOptions();

IResourceGraph resourceGraph = DependencyFactory.CreateResourceGraph();
IFieldsToSerialize fieldsToSerialize = CreateFieldsToSerialize(resourceGraph);

Expand All @@ -33,7 +36,7 @@ public JsonApiSerializerBenchmarks()
var resourceObjectBuilder = new ResourceObjectBuilder(resourceGraph, new ResourceObjectBuilderSettings());

_jsonApiSerializer = new ResponseSerializer<BenchmarkResource>(metaBuilderMock.Object, linkBuilderMock.Object,
includeBuilderMock.Object, fieldsToSerialize, resourceObjectBuilder);
includeBuilderMock.Object, fieldsToSerialize, resourceObjectBuilder, options);
}

private static FieldsToSerialize CreateFieldsToSerialize(IResourceGraph resourceGraph)
Expand Down
3 changes: 3 additions & 0 deletions src/JsonApiDotNetCore/Configuration/IJsonApiOptions.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Newtonsoft.Json;

namespace JsonApiDotNetCore.Configuration
{
public interface IJsonApiOptions : ILinksConfiguration, ISerializerOptions
Expand Down Expand Up @@ -25,6 +27,7 @@ public interface IJsonApiOptions : ILinksConfiguration, ISerializerOptions
bool AllowClientGeneratedIds { get; }
bool AllowCustomQueryParameters { get; set; }
string Namespace { get; set; }
JsonSerializerSettings SerializerSettings { get; }
}

public interface ISerializerOptions
Expand Down
2 changes: 1 addition & 1 deletion src/JsonApiDotNetCore/Configuration/JsonApiOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public class JsonApiOptions : IJsonApiOptions
/// </example>
public bool ValidateModelState { get; set; }

public JsonSerializerSettings SerializerSettings { get; } = new JsonSerializerSettings()
public JsonSerializerSettings SerializerSettings { get; } = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
};
Expand Down
16 changes: 11 additions & 5 deletions src/JsonApiDotNetCore/Internal/Exceptions/ErrorCollection.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using JsonApiDotNetCore.Serialization.Common;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Microsoft.AspNetCore.Mvc;
Expand All @@ -20,12 +21,17 @@ public void Add(Error error)
Errors.Add(error);
}

public string GetJson()
public string GetJson(JsonSerializerSettings serializerSettings)
{
return JsonConvert.SerializeObject(this, new JsonSerializerSettings {
NullValueHandling = NullValueHandling.Ignore,
ContractResolver = new CamelCasePropertyNamesContractResolver()
});
var beforeContractResolver = serializerSettings.ContractResolver;
serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

using var scope = new JsonSerializerSettingsNullValueHandlingScope(serializerSettings, NullValueHandling.Ignore);
string json = JsonConvert.SerializeObject(this, serializerSettings);

serializerSettings.ContractResolver = beforeContractResolver;

return json;
}

public int GetErrorStatusCode()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System;
using Newtonsoft.Json;

namespace JsonApiDotNetCore.Serialization.Common
{
/// <summary>
/// Used to temporarily switch to a different <see cref="JsonSerializerSettings.NullValueHandling"/> value while preserving other settings.
/// After disposal, the original NullValueHandling value is restored.
/// </summary>
internal sealed class JsonSerializerSettingsNullValueHandlingScope : IDisposable
{
private readonly NullValueHandling _beforeNullValueHandling;

public JsonSerializerSettings Settings { get; set; }

public JsonSerializerSettingsNullValueHandlingScope(JsonSerializerSettings settings,
NullValueHandling nullValueHandling)
{
_beforeNullValueHandling = settings.NullValueHandling;
Settings = settings;

Settings.NullValueHandling = nullValueHandling;
}

public void Dispose()
{
Settings.NullValueHandling = _beforeNullValueHandling;
}
}
}
Loading