Skip to content

Commit 2f23373

Browse files
committed
This reverts commit 29fd458.
1 parent 29fd458 commit 2f23373

File tree

14 files changed

+41
-67
lines changed

14 files changed

+41
-67
lines changed

benchmarks/Deserialization/DeserializationBenchmarkBase.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
using System.ComponentModel.Design;
2+
using System.Text.Json;
23
using JetBrains.Annotations;
34
using JsonApiDotNetCore.Configuration;
45
using JsonApiDotNetCore.Middleware;
56
using JsonApiDotNetCore.Resources;
67
using JsonApiDotNetCore.Resources.Annotations;
7-
using JsonApiDotNetCore.Serialization;
88
using JsonApiDotNetCore.Serialization.JsonConverters;
99
using JsonApiDotNetCore.Serialization.Request.Adapters;
1010
using Microsoft.Extensions.Logging.Abstractions;
@@ -13,15 +13,15 @@ namespace Benchmarks.Deserialization;
1313

1414
public abstract class DeserializationBenchmarkBase
1515
{
16-
protected readonly JsonApiSerializationContext SerializationReadContext;
16+
protected readonly JsonSerializerOptions SerializerReadOptions;
1717
protected readonly DocumentAdapter DocumentAdapter;
1818

1919
protected DeserializationBenchmarkBase()
2020
{
2121
var options = new JsonApiOptions();
2222
IResourceGraph resourceGraph = new ResourceGraphBuilder(options, NullLoggerFactory.Instance).Add<IncomingResource, int>().Build();
2323
options.SerializerOptions.Converters.Add(new ResourceObjectConverter(resourceGraph));
24-
SerializationReadContext = ((IJsonApiOptions)options).SerializationReadContext;
24+
SerializerReadOptions = ((IJsonApiOptions)options).SerializerReadOptions;
2525

2626
var serviceContainer = new ServiceContainer();
2727
var resourceFactory = new ResourceFactory(serviceContainer);

benchmarks/Deserialization/OperationsDeserializationBenchmarks.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ public class OperationsDeserializationBenchmarks : DeserializationBenchmarkBase
270270
[Benchmark]
271271
public object? DeserializeOperationsRequest()
272272
{
273-
Document document = JsonSerializer.Deserialize(RequestBody, SerializationReadContext.Document)!;
273+
var document = JsonSerializer.Deserialize<Document>(RequestBody, SerializerReadOptions)!;
274274
return DocumentAdapter.Convert(document);
275275
}
276276

benchmarks/Deserialization/ResourceDeserializationBenchmarks.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ public class ResourceDeserializationBenchmarks : DeserializationBenchmarkBase
133133
[Benchmark]
134134
public object? DeserializeResourceRequest()
135135
{
136-
Document document = JsonSerializer.Deserialize(RequestBody, SerializationReadContext.Document)!;
136+
var document = JsonSerializer.Deserialize<Document>(RequestBody, SerializerReadOptions)!;
137137
return DocumentAdapter.Convert(document);
138138
}
139139

benchmarks/Serialization/OperationsSerializationBenchmarks.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ private static IEnumerable<OperationContainer> CreateResponseOperations(IJsonApi
116116
public string SerializeOperationsResponse()
117117
{
118118
Document responseDocument = ResponseModelAdapter.Convert(_responseOperations);
119-
return JsonSerializer.Serialize(responseDocument, SerializationWriteContext.Document);
119+
return JsonSerializer.Serialize(responseDocument, SerializerWriteOptions);
120120
}
121121

122122
protected override JsonApiRequest CreateJsonApiRequest(IResourceGraph resourceGraph)

benchmarks/Serialization/ResourceSerializationBenchmarks.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ private static OutgoingResource CreateResponseResource()
107107
public string SerializeResourceResponse()
108108
{
109109
Document responseDocument = ResponseModelAdapter.Convert(ResponseResource);
110-
return JsonSerializer.Serialize(responseDocument, SerializationWriteContext.Document);
110+
return JsonSerializer.Serialize(responseDocument, SerializerWriteOptions);
111111
}
112112

113113
protected override JsonApiRequest CreateJsonApiRequest(IResourceGraph resourceGraph)

benchmarks/Serialization/SerializationBenchmarkBase.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Immutable;
2+
using System.Text.Json;
23
using System.Text.Json.Serialization;
34
using Benchmarks.Tools;
45
using JetBrains.Annotations;
@@ -10,7 +11,6 @@
1011
using JsonApiDotNetCore.QueryStrings;
1112
using JsonApiDotNetCore.Resources;
1213
using JsonApiDotNetCore.Resources.Annotations;
13-
using JsonApiDotNetCore.Serialization;
1414
using JsonApiDotNetCore.Serialization.Objects;
1515
using JsonApiDotNetCore.Serialization.Response;
1616
using Microsoft.AspNetCore.Http;
@@ -20,7 +20,7 @@ namespace Benchmarks.Serialization;
2020

2121
public abstract class SerializationBenchmarkBase
2222
{
23-
protected readonly JsonApiSerializationContext SerializationWriteContext;
23+
protected readonly JsonSerializerOptions SerializerWriteOptions;
2424
protected readonly IResponseModelAdapter ResponseModelAdapter;
2525
protected readonly IResourceGraph ResourceGraph;
2626

@@ -38,7 +38,7 @@ protected SerializationBenchmarkBase()
3838
};
3939

4040
ResourceGraph = new ResourceGraphBuilder(options, NullLoggerFactory.Instance).Add<OutgoingResource, int>().Build();
41-
SerializationWriteContext = ((IJsonApiOptions)options).SerializationWriteContext;
41+
SerializerWriteOptions = ((IJsonApiOptions)options).SerializerWriteOptions;
4242

4343
// ReSharper disable VirtualMemberCallInConstructor
4444
JsonApiRequest request = CreateJsonApiRequest(ResourceGraph);

src/JsonApiDotNetCore/Configuration/IJsonApiOptions.cs

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
using System.Data;
22
using System.Text.Json;
3-
using JetBrains.Annotations;
43
using JsonApiDotNetCore.Resources.Annotations;
5-
using JsonApiDotNetCore.Serialization;
64
using JsonApiDotNetCore.Serialization.Objects;
75

86
namespace JsonApiDotNetCore.Configuration;
97

108
/// <summary>
119
/// Global options that configure the behavior of JsonApiDotNetCore.
1210
/// </summary>
13-
[PublicAPI]
1411
public interface IJsonApiOptions
1512
{
1613
/// <summary>
@@ -159,27 +156,13 @@ public interface IJsonApiOptions
159156
/// </example>
160157
JsonSerializerOptions SerializerOptions { get; }
161158

162-
/// <summary>
163-
/// Gets the source-generated JSON serialization context used for deserializing request bodies. This value is based on <see cref="SerializerOptions" />
164-
/// and is intended for internal use.
165-
/// </summary>
166-
JsonApiSerializationContext SerializationReadContext { get; }
167-
168159
/// <summary>
169160
/// Gets the settings used for deserializing request bodies. This value is based on <see cref="SerializerOptions" /> and is intended for internal use.
170161
/// </summary>
171-
[Obsolete("Use SerializationReadContext.Options instead.")]
172162
JsonSerializerOptions SerializerReadOptions { get; }
173163

174-
/// <summary>
175-
/// Gets the source-generated JSON serialization context used for serializing response bodies. This value is based on <see cref="SerializerOptions" />
176-
/// and is intended for internal use.
177-
/// </summary>
178-
JsonApiSerializationContext SerializationWriteContext { get; }
179-
180164
/// <summary>
181165
/// Gets the settings used for serializing response bodies. This value is based on <see cref="SerializerOptions" /> and is intended for internal use.
182166
/// </summary>
183-
[Obsolete("Use SerializationWriteContext.Options instead.")]
184167
JsonSerializerOptions SerializerWriteOptions { get; }
185168
}

src/JsonApiDotNetCore/Middleware/JsonApiMiddleware.cs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using JsonApiDotNetCore.Configuration;
55
using JsonApiDotNetCore.Diagnostics;
66
using JsonApiDotNetCore.Resources.Annotations;
7-
using JsonApiDotNetCore.Serialization;
87
using JsonApiDotNetCore.Serialization.Objects;
98
using Microsoft.AspNetCore.Http;
109
using Microsoft.AspNetCore.Http.Extensions;
@@ -45,7 +44,7 @@ public async Task InvokeAsync(HttpContext httpContext, IControllerResourceMappin
4544

4645
using (CodeTimingSessionManager.Current.Measure("JSON:API middleware"))
4746
{
48-
if (!await ValidateIfMatchHeaderAsync(httpContext, options.SerializationWriteContext))
47+
if (!await ValidateIfMatchHeaderAsync(httpContext, options.SerializerWriteOptions))
4948
{
5049
return;
5150
}
@@ -55,8 +54,8 @@ public async Task InvokeAsync(HttpContext httpContext, IControllerResourceMappin
5554

5655
if (primaryResourceType != null)
5756
{
58-
if (!await ValidateContentTypeHeaderAsync(HeaderConstants.MediaType, httpContext, options.SerializationWriteContext) ||
59-
!await ValidateAcceptHeaderAsync(MediaType, httpContext, options.SerializationWriteContext))
57+
if (!await ValidateContentTypeHeaderAsync(HeaderConstants.MediaType, httpContext, options.SerializerWriteOptions) ||
58+
!await ValidateAcceptHeaderAsync(MediaType, httpContext, options.SerializerWriteOptions))
6059
{
6160
return;
6261
}
@@ -67,8 +66,8 @@ public async Task InvokeAsync(HttpContext httpContext, IControllerResourceMappin
6766
}
6867
else if (IsRouteForOperations(routeValues))
6968
{
70-
if (!await ValidateContentTypeHeaderAsync(HeaderConstants.AtomicOperationsMediaType, httpContext, options.SerializationWriteContext) ||
71-
!await ValidateAcceptHeaderAsync(AtomicOperationsMediaType, httpContext, options.SerializationWriteContext))
69+
if (!await ValidateContentTypeHeaderAsync(HeaderConstants.AtomicOperationsMediaType, httpContext, options.SerializerWriteOptions) ||
70+
!await ValidateAcceptHeaderAsync(AtomicOperationsMediaType, httpContext, options.SerializerWriteOptions))
7271
{
7372
return;
7473
}
@@ -92,11 +91,11 @@ public async Task InvokeAsync(HttpContext httpContext, IControllerResourceMappin
9291
}
9392
}
9493

95-
private async Task<bool> ValidateIfMatchHeaderAsync(HttpContext httpContext, JsonApiSerializationContext serializationContext)
94+
private async Task<bool> ValidateIfMatchHeaderAsync(HttpContext httpContext, JsonSerializerOptions serializerOptions)
9695
{
9796
if (httpContext.Request.Headers.ContainsKey(HeaderNames.IfMatch))
9897
{
99-
await FlushResponseAsync(httpContext.Response, serializationContext, new ErrorObject(HttpStatusCode.PreconditionFailed)
98+
await FlushResponseAsync(httpContext.Response, serializerOptions, new ErrorObject(HttpStatusCode.PreconditionFailed)
10099
{
101100
Title = "Detection of mid-air edit collisions using ETags is not supported.",
102101
Source = new ErrorSource
@@ -121,14 +120,13 @@ private async Task<bool> ValidateIfMatchHeaderAsync(HttpContext httpContext, Jso
121120
: null;
122121
}
123122

124-
private static async Task<bool> ValidateContentTypeHeaderAsync(string allowedContentType, HttpContext httpContext,
125-
JsonApiSerializationContext serializationContext)
123+
private static async Task<bool> ValidateContentTypeHeaderAsync(string allowedContentType, HttpContext httpContext, JsonSerializerOptions serializerOptions)
126124
{
127125
string? contentType = httpContext.Request.ContentType;
128126

129127
if (contentType != null && contentType != allowedContentType)
130128
{
131-
await FlushResponseAsync(httpContext.Response, serializationContext, new ErrorObject(HttpStatusCode.UnsupportedMediaType)
129+
await FlushResponseAsync(httpContext.Response, serializerOptions, new ErrorObject(HttpStatusCode.UnsupportedMediaType)
132130
{
133131
Title = "The specified Content-Type header value is not supported.",
134132
Detail = $"Please specify '{allowedContentType}' instead of '{contentType}' for the Content-Type header value.",
@@ -145,7 +143,7 @@ private static async Task<bool> ValidateContentTypeHeaderAsync(string allowedCon
145143
}
146144

147145
private static async Task<bool> ValidateAcceptHeaderAsync(MediaTypeHeaderValue allowedMediaTypeValue, HttpContext httpContext,
148-
JsonApiSerializationContext serializationContext)
146+
JsonSerializerOptions serializerOptions)
149147
{
150148
string[] acceptHeaders = httpContext.Request.Headers.GetCommaSeparatedValues("Accept");
151149

@@ -178,7 +176,7 @@ private static async Task<bool> ValidateAcceptHeaderAsync(MediaTypeHeaderValue a
178176

179177
if (!seenCompatibleMediaType)
180178
{
181-
await FlushResponseAsync(httpContext.Response, serializationContext, new ErrorObject(HttpStatusCode.NotAcceptable)
179+
await FlushResponseAsync(httpContext.Response, serializerOptions, new ErrorObject(HttpStatusCode.NotAcceptable)
182180
{
183181
Title = "The specified Accept header value does not contain any supported media types.",
184182
Detail = $"Please include '{allowedMediaTypeValue}' in the Accept header values.",
@@ -194,7 +192,7 @@ private static async Task<bool> ValidateAcceptHeaderAsync(MediaTypeHeaderValue a
194192
return true;
195193
}
196194

197-
private static async Task FlushResponseAsync(HttpResponse httpResponse, JsonApiSerializationContext serializationContext, ErrorObject error)
195+
private static async Task FlushResponseAsync(HttpResponse httpResponse, JsonSerializerOptions serializerOptions, ErrorObject error)
198196
{
199197
httpResponse.ContentType = HeaderConstants.MediaType;
200198
httpResponse.StatusCode = (int)error.StatusCode;
@@ -204,7 +202,7 @@ private static async Task FlushResponseAsync(HttpResponse httpResponse, JsonApiS
204202
Errors = error.AsList()
205203
};
206204

207-
await JsonSerializer.SerializeAsync(httpResponse.Body, errorDocument, serializationContext.Document);
205+
await JsonSerializer.SerializeAsync(httpResponse.Body, errorDocument, serializerOptions);
208206
await httpResponse.Body.FlushAsync();
209207
}
210208

src/JsonApiDotNetCore/Serialization/JsonApiSerializationContext.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/JsonApiDotNetCore/Serialization/JsonConverters/JsonObjectConverter.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,24 @@ public abstract class JsonObjectConverter<TObject> : JsonConverter<TObject>
77
{
88
protected static TValue? ReadSubTree<TValue>(ref Utf8JsonReader reader, JsonSerializerOptions options)
99
{
10+
if (typeof(TValue) != typeof(object) && options.GetConverter(typeof(TValue)) is JsonConverter<TValue> converter)
11+
{
12+
return converter.Read(ref reader, typeof(TValue), options);
13+
}
14+
1015
return JsonSerializer.Deserialize<TValue>(ref reader, options);
1116
}
1217

1318
protected static void WriteSubTree<TValue>(Utf8JsonWriter writer, TValue value, JsonSerializerOptions options)
1419
{
15-
JsonSerializer.Serialize(writer, value, options);
20+
if (typeof(TValue) != typeof(object) && options.GetConverter(typeof(TValue)) is JsonConverter<TValue> converter)
21+
{
22+
converter.Write(writer, value, options);
23+
}
24+
else
25+
{
26+
JsonSerializer.Serialize(writer, value, options);
27+
}
1628
}
1729

1830
protected static JsonException GetEndOfStreamError()

src/JsonApiDotNetCore/Serialization/Objects/Document.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
using System.Text.Json.Serialization;
2-
using JetBrains.Annotations;
32

43
namespace JsonApiDotNetCore.Serialization.Objects;
54

65
/// <summary>
76
/// See https://jsonapi.org/format/1.1/#document-top-level and https://jsonapi.org/ext/atomic/#document-structure.
87
/// </summary>
9-
[PublicAPI]
108
public sealed class Document
119
{
1210
[JsonPropertyName("jsonapi")]

src/JsonApiDotNetCore/Serialization/Request/JsonApiReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ private Document DeserializeDocument(string requestBody)
8080
using IDisposable _ =
8181
CodeTimingSessionManager.Current.Measure("JsonSerializer.Deserialize", MeasurementSettings.ExcludeJsonSerializationInPercentages);
8282

83-
Document? document = JsonSerializer.Deserialize(requestBody, _options.SerializationReadContext.Document);
83+
var document = JsonSerializer.Deserialize<Document>(requestBody, _options.SerializerReadOptions);
8484

8585
AssertHasDocument(document, requestBody);
8686

src/JsonApiDotNetCore/Serialization/Response/JsonApiWriter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ private string SerializeDocument(Document document)
125125
{
126126
using IDisposable _ = CodeTimingSessionManager.Current.Measure("JsonSerializer.Serialize", MeasurementSettings.ExcludeJsonSerializationInPercentages);
127127

128-
return JsonSerializer.Serialize(document, _options.SerializationWriteContext.Document);
128+
return JsonSerializer.Serialize(document, _options.SerializerWriteOptions);
129129
}
130130

131131
private bool SetETagResponseHeader(HttpRequest request, HttpResponse response, string responseContent)

test/JsonApiDotNetCoreTests/UnitTests/Serialization/Response/ResponseModelAdapterTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public void Resources_in_deeply_nested_circular_chain_are_written_in_relationshi
3838
Document document = responseModelAdapter.Convert(article);
3939

4040
// Assert
41-
string text = JsonSerializer.Serialize(document, options.SerializationWriteContext.Document);
41+
string text = JsonSerializer.Serialize(document, new JsonSerializerOptions(options.SerializerWriteOptions));
4242

4343
text.Should().BeJson(@"{
4444
""data"": {
@@ -175,7 +175,7 @@ public void Resources_in_deeply_nested_circular_chains_are_written_in_relationsh
175175
});
176176

177177
// Assert
178-
string text = JsonSerializer.Serialize(document, options.SerializationWriteContext.Document);
178+
string text = JsonSerializer.Serialize(document, new JsonSerializerOptions(options.SerializerWriteOptions));
179179

180180
text.Should().BeJson(@"{
181181
""data"": [
@@ -333,7 +333,7 @@ public void Resources_in_overlapping_deeply_nested_circular_chains_are_written_i
333333
Document document = responseModelAdapter.Convert(article);
334334

335335
// Assert
336-
string text = JsonSerializer.Serialize(document, options.SerializationWriteContext.Document);
336+
string text = JsonSerializer.Serialize(document, new JsonSerializerOptions(options.SerializerWriteOptions));
337337

338338
text.Should().BeJson(@"{
339339
""data"": {

0 commit comments

Comments
 (0)