Pass the formatter context to the CreateJsonSerializer. It gives ability to override and create serializer specific to the context (#8358)

* Pass the formatter context to the CreateJsonSerializer so that it gives ability to override and create serializer specific to the context
This commit is contained in:
mnltejaswini 2019-03-20 12:01:41 -07:00 committed by Pranav K
parent 314f67ec6e
commit 2a08c6e54d
4 changed files with 36 additions and 6 deletions

View File

@ -25,6 +25,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
public virtual Microsoft.AspNetCore.Mvc.Formatters.InputFormatterExceptionPolicy ExceptionPolicy { get { throw null; } }
protected Newtonsoft.Json.JsonSerializerSettings SerializerSettings { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
protected virtual Newtonsoft.Json.JsonSerializer CreateJsonSerializer() { throw null; }
protected virtual Newtonsoft.Json.JsonSerializer CreateJsonSerializer(Microsoft.AspNetCore.Mvc.Formatters.InputFormatterContext context) { throw null; }
[System.Diagnostics.DebuggerStepThroughAttribute]
public override System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.Formatters.InputFormatterResult> ReadRequestBodyAsync(Microsoft.AspNetCore.Mvc.Formatters.InputFormatterContext context, System.Text.Encoding encoding) { throw null; }
protected virtual void ReleaseJsonSerializer(Newtonsoft.Json.JsonSerializer serializer) { }
@ -34,6 +35,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
public NewtonsoftJsonOutputFormatter(Newtonsoft.Json.JsonSerializerSettings serializerSettings, System.Buffers.ArrayPool<char> charPool) { }
protected Newtonsoft.Json.JsonSerializerSettings SerializerSettings { [System.Runtime.CompilerServices.CompilerGeneratedAttribute]get { throw null; } }
protected virtual Newtonsoft.Json.JsonSerializer CreateJsonSerializer() { throw null; }
protected virtual Newtonsoft.Json.JsonSerializer CreateJsonSerializer(Microsoft.AspNetCore.Mvc.Formatters.OutputFormatterWriteContext context) { throw null; }
protected virtual Newtonsoft.Json.JsonWriter CreateJsonWriter(System.IO.TextWriter writer) { throw null; }
[System.Diagnostics.DebuggerStepThroughAttribute]
public override System.Threading.Tasks.Task WriteResponseBodyAsync(Microsoft.AspNetCore.Mvc.Formatters.OutputFormatterWriteContext context, System.Text.Encoding selectedEncoding) { throw null; }

View File

@ -202,7 +202,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
}
var type = context.ModelType;
var jsonSerializer = CreateJsonSerializer();
var jsonSerializer = CreateJsonSerializer(context);
jsonSerializer.Error += ErrorHandler;
object model;
try
@ -244,7 +244,8 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
}
/// <summary>
/// Called during deserialization to get the <see cref="JsonSerializer"/>.
/// Called during deserialization to get the <see cref="JsonSerializer"/>. The formatter context
/// that is passed gives an ability to create serializer specific to the context.
/// </summary>
/// <returns>The <see cref="JsonSerializer"/> used during deserialization.</returns>
/// <remarks>
@ -261,6 +262,21 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
return _jsonSerializerPool.Get();
}
/// <summary>
/// Called during deserialization to get the <see cref="JsonSerializer"/>. The formatter context
/// that is passed gives an ability to create serializer specific to the context.
/// </summary>
/// <param name="context">A context object used by an input formatter for deserializing the request body into an object.</param>
/// <returns>The <see cref="JsonSerializer"/> used during deserialization.</returns>
/// <remarks>
/// This method works in tandem with <see cref="ReleaseJsonSerializer(JsonSerializer)"/> to
/// manage the lifetimes of <see cref="JsonSerializer"/> instances.
/// </remarks>
protected virtual JsonSerializer CreateJsonSerializer(InputFormatterContext context)
{
return CreateJsonSerializer();
}
/// <summary>
/// Releases the <paramref name="serializer"/> instance.
/// </summary>

View File

@ -85,7 +85,8 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
}
/// <summary>
/// Called during serialization to create the <see cref="JsonSerializer"/>.
/// Called during serialization to create the <see cref="JsonSerializer"/>.The formatter context
/// that is passed gives an ability to create serializer specific to the context.
/// </summary>
/// <returns>The <see cref="JsonSerializer"/> used during serialization and deserialization.</returns>
protected virtual JsonSerializer CreateJsonSerializer()
@ -98,6 +99,17 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
return _serializer;
}
/// <summary>
/// Called during serialization to create the <see cref="JsonSerializer"/>.The formatter context
/// that is passed gives an ability to create serializer specific to the context.
/// </summary>
/// <param name="context">A context object for <see cref="IOutputFormatter.WriteAsync(OutputFormatterWriteContext)"/>.</param>
/// <returns>The <see cref="JsonSerializer"/> used during serialization and deserialization.</returns>
protected virtual JsonSerializer CreateJsonSerializer(OutputFormatterWriteContext context)
{
return CreateJsonSerializer();
}
/// <inheritdoc />
public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
{
@ -123,7 +135,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
{
using (var jsonWriter = CreateJsonWriter(writer))
{
var jsonSerializer = CreateJsonSerializer();
var jsonSerializer = CreateJsonSerializer(context);
jsonSerializer.Serialize(jsonWriter, context.Object);
}

View File

@ -474,7 +474,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
var formatter = new TestableJsonInputFormatter(settings);
// Act
var actual = formatter.CreateJsonSerializer();
var actual = formatter.CreateJsonSerializer(null);
// Assert
Assert.Same(settings.ContractResolver, actual.ContractResolver);
@ -578,7 +578,7 @@ namespace Microsoft.AspNetCore.Mvc.Formatters
public new JsonSerializerSettings SerializerSettings => base.SerializerSettings;
public new JsonSerializer CreateJsonSerializer() => base.CreateJsonSerializer();
public new JsonSerializer CreateJsonSerializer(InputFormatterContext _) => base.CreateJsonSerializer(null);
}
private static ILogger GetLogger()