Skip to content

Commit 11a8fe9

Browse files
Use Copy Constructor for JsonSerializerSettings
Fixes #29532 Fixes an issue where JsonSerializerSettings.DateFormatString overwrites DateFormatHandling. See #29532 for details
1 parent 8491a27 commit 11a8fe9

File tree

2 files changed

+18
-39
lines changed

2 files changed

+18
-39
lines changed

src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonOutputFormatter.cs

+1-39
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ protected virtual JsonSerializer CreateJsonSerializer()
113113
if (_serializerSettings == null)
114114
{
115115
// Lock the serializer settings once the first serialization has been initiated.
116-
_serializerSettings = ShallowCopy(SerializerSettings);
116+
_serializerSettings = new JsonSerializerSettings(SerializerSettings);
117117
}
118118

119119
return JsonSerializer.Create(_serializerSettings);
@@ -190,44 +190,6 @@ public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext co
190190
}
191191
}
192192

193-
private static JsonSerializerSettings ShallowCopy(JsonSerializerSettings settings)
194-
{
195-
var copiedSettings = new JsonSerializerSettings
196-
{
197-
FloatParseHandling = settings.FloatParseHandling,
198-
FloatFormatHandling = settings.FloatFormatHandling,
199-
DateParseHandling = settings.DateParseHandling,
200-
DateTimeZoneHandling = settings.DateTimeZoneHandling,
201-
DateFormatHandling = settings.DateFormatHandling,
202-
Formatting = settings.Formatting,
203-
MaxDepth = settings.MaxDepth,
204-
DateFormatString = settings.DateFormatString,
205-
Context = settings.Context,
206-
Error = settings.Error,
207-
SerializationBinder = settings.SerializationBinder,
208-
TraceWriter = settings.TraceWriter,
209-
Culture = settings.Culture,
210-
ReferenceResolverProvider = settings.ReferenceResolverProvider,
211-
EqualityComparer = settings.EqualityComparer,
212-
ContractResolver = settings.ContractResolver,
213-
ConstructorHandling = settings.ConstructorHandling,
214-
TypeNameAssemblyFormatHandling = settings.TypeNameAssemblyFormatHandling,
215-
MetadataPropertyHandling = settings.MetadataPropertyHandling,
216-
TypeNameHandling = settings.TypeNameHandling,
217-
PreserveReferencesHandling = settings.PreserveReferencesHandling,
218-
Converters = settings.Converters,
219-
DefaultValueHandling = settings.DefaultValueHandling,
220-
NullValueHandling = settings.NullValueHandling,
221-
ObjectCreationHandling = settings.ObjectCreationHandling,
222-
MissingMemberHandling = settings.MissingMemberHandling,
223-
ReferenceLoopHandling = settings.ReferenceLoopHandling,
224-
CheckAdditionalContent = settings.CheckAdditionalContent,
225-
StringEscapeHandling = settings.StringEscapeHandling,
226-
};
227-
228-
return copiedSettings;
229-
}
230-
231193
private static partial class Log
232194
{
233195
[LoggerMessage(1, LogLevel.Debug, "Buffering IAsyncEnumerable instance of type '{Type}'.", EventName = "BufferingAsyncEnumerable", SkipEnabledCheck = true)]

src/Mvc/Mvc.NewtonsoftJson/test/NewtonsoftJsonOutputFormatterTest.cs

+17
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,23 @@ async IAsyncEnumerable<int> AsyncEnumerableThrows([EnumeratorCancellation] Cance
549549
}
550550
}
551551

552+
[Fact]
553+
public void JsonSerializerSettingsCopyConstructor_DoesNotOverrideDateFormatHandling()
554+
{
555+
// Arrange
556+
var originalSettings = new JsonSerializerSettings
557+
{
558+
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
559+
};
560+
561+
// Act
562+
var copiedSettings = new JsonSerializerSettings(originalSettings);
563+
564+
// Assert
565+
Assert.Equal(originalSettings.MicrosoftDateFormat, copiedSettings.DateFormatHandling);
566+
Assert.Equal(originalSettings.DateFormatString, copiedSettings.DateFormatString);
567+
}
568+
552569
private class TestableJsonOutputFormatter : NewtonsoftJsonOutputFormatter
553570
{
554571
public TestableJsonOutputFormatter(JsonSerializerSettings serializerSettings)

0 commit comments

Comments
 (0)