Skip to content

Commit

Permalink
Read some System.Text.Json options (#2655)
Browse files Browse the repository at this point in the history
* Read System.Text.Json options

* Tests for System.Text.Json options

* Update AspNetCoreOpenApiDocumentGenerator.cs

* Move code to NJS and update

* Fix version

* Clean up tests

Co-authored-by: Sindre Kroknes <shkroknes@maritech.no>
Co-authored-by: Rico Suter <mail@rsuter.com>
  • Loading branch information
3 people committed May 8, 2020
1 parent b4a6247 commit b2edb46
Show file tree
Hide file tree
Showing 28 changed files with 212 additions and 58 deletions.
2 changes: 1 addition & 1 deletion src/NSwag.AspNet.Owin/NSwag.AspNet.Owin.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.Owin" Version="3.0.1" />
<PackageReference Include="Microsoft.Owin.StaticFiles" Version="3.0.1" />
<PackageReference Include="NJsonSchema" Version="10.1.11" />
<PackageReference Include="NJsonSchema" Version="10.1.14" />
<PackageReference Include="Owin" Version="1.0" />
</ItemGroup>
<ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion src/NSwag.AspNet.WebApi/NSwag.AspNet.WebApi.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.AspNet.WebApi.Core" Version="5.2.3" />
<PackageReference Include="Microsoft.AspNet.WebApi.Client" Version="5.2.3" />
<PackageReference Include="NJsonSchema" Version="10.1.11" />
<PackageReference Include="NJsonSchema" Version="10.1.14" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NSwag.Annotations\NSwag.Annotations.csproj" />
Expand Down
2 changes: 1 addition & 1 deletion src/NSwag.AssemblyLoader/NSwag.AssemblyLoader.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
<DefineConstants>TRACE;RELEASE;FullNet;NET451</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NJsonSchema" Version="10.1.11" />
<PackageReference Include="NJsonSchema" Version="10.1.14" />
<PackageReference Include="System.Net.Http" Version="4.3.2" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.6' OR '$(TargetFramework)' == 'netstandard2.0' ">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,6 @@
<Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NJsonSchema.CodeGeneration.CSharp" Version="10.1.11" />
<PackageReference Include="NJsonSchema.CodeGeneration.CSharp" Version="10.1.14" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,6 @@
<Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="NJsonSchema.CodeGeneration.TypeScript" Version="10.1.11" />
<PackageReference Include="NJsonSchema.CodeGeneration.TypeScript" Version="10.1.14" />
</ItemGroup>
</Project>
4 changes: 2 additions & 2 deletions src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
<PackageReference Include="NJsonSchema" Version="10.1.11" />
<PackageReference Include="NJsonSchema.CodeGeneration" Version="10.1.11" />
<PackageReference Include="NJsonSchema" Version="10.1.14" />
<PackageReference Include="NJsonSchema.CodeGeneration" Version="10.1.14" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net451'">
<Reference Include="Microsoft.CSharp" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ public async Task<TSettings> CreateSettingsAsync(AssemblyLoader.AssemblyLoader a
}
catch
{
serializerSettings = AspNetCoreOpenApiDocumentGenerator.GetSystemTextJsonSettings();
serializerSettings = AspNetCoreOpenApiDocumentGenerator.GetSystemTextJsonSettings(serviceProvider);
}
#else
var mvcJsonOptions = serviceProvider?.GetRequiredService<IOptions<MvcJsonOptions>>();
Expand Down
10 changes: 5 additions & 5 deletions src/NSwag.Commands/NSwag.Commands.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,11 @@
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.PlatformAbstractions" Version="1.1.0" />
<PackageReference Include="NConsole" Version="3.9.6519.30868" />
<PackageReference Include="NJsonSchema" Version="10.1.11" />
<PackageReference Include="NJsonSchema.CodeGeneration" Version="10.1.11" />
<PackageReference Include="NJsonSchema.CodeGeneration.CSharp" Version="10.1.11" />
<PackageReference Include="NJsonSchema.CodeGeneration.TypeScript" Version="10.1.11" />
<PackageReference Include="NJsonSchema.Yaml" Version="10.1.11" />
<PackageReference Include="NJsonSchema" Version="10.1.14" />
<PackageReference Include="NJsonSchema.CodeGeneration" Version="10.1.14" />
<PackageReference Include="NJsonSchema.CodeGeneration.CSharp" Version="10.1.14" />
<PackageReference Include="NJsonSchema.CodeGeneration.TypeScript" Version="10.1.14" />
<PackageReference Include="NJsonSchema.Yaml" Version="10.1.14" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
<Reference Include="Microsoft.CSharp" />
Expand Down
2 changes: 1 addition & 1 deletion src/NSwag.Core.Yaml/NSwag.Core.Yaml.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<RootNamespace>NSwag</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NJsonSchema.Yaml" Version="10.1.11" />
<PackageReference Include="NJsonSchema.Yaml" Version="10.1.14" />
<PackageReference Include="YamlDotNet.Signed" Version="5.1.0" />
</ItemGroup>
<ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion src/NSwag.Core/NSwag.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
<PackageReference Include="NJsonSchema" Version="10.1.11" />
<PackageReference Include="NJsonSchema" Version="10.1.14" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
<Reference Include="Microsoft.CSharp" />
Expand Down
4 changes: 2 additions & 2 deletions src/NSwag.Demo.Web/NSwag.Demo.Web.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="NJsonSchema, Version=10.1.11.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
<HintPath>..\packages\NJsonSchema.10.1.11\lib\net45\NJsonSchema.dll</HintPath>
<Reference Include="NJsonSchema, Version=10.1.14.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
<HintPath>..\packages\NJsonSchema.10.1.14\lib\net45\NJsonSchema.dll</HintPath>
</Reference>
<Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
<HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
Expand Down
2 changes: 1 addition & 1 deletion src/NSwag.Demo.Web/packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
<package id="Namotion.Reflection" version="1.0.11" targetFramework="net46" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
<package id="NJsonSchema" version="10.1.11" targetFramework="net46" />
<package id="NJsonSchema" version="10.1.14" targetFramework="net46" />
<package id="Owin" version="1.0" targetFramework="net45" />
</packages>
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public async Task<OpenApiDocument> GenerateAsync(object serviceProvider)
var typedServiceProvider = (IServiceProvider)serviceProvider;

var mvcOptions = typedServiceProvider.GetRequiredService<IOptions<MvcOptions>>();
var settings = GetJsonSerializerSettings(typedServiceProvider) ?? GetSystemTextJsonSettings();
var settings = GetJsonSerializerSettings(typedServiceProvider) ?? GetSystemTextJsonSettings(typedServiceProvider);

Settings.ApplySettings(settings, mvcOptions.Value);

Expand Down Expand Up @@ -127,11 +127,32 @@ public async Task<OpenApiDocument> GenerateAsync(ApiDescriptionGroupCollection a

/// <summary>Gets the default serializer settings representing System.Text.Json.</summary>
/// <returns>The settings.</returns>
public static JsonSerializerSettings GetSystemTextJsonSettings()
public static JsonSerializerSettings GetSystemTextJsonSettings(IServiceProvider serviceProvider)
{
// If the ASP.NET Core website does not use Newtonsoft.JSON we need to provide a
// contract resolver which reflects best the System.Text.Json behavior.
// See https://github.com/RicoSuter/NSwag/issues/2243

#if NETSTANDARD2_0
if (serviceProvider != null)
{
try
{
var optionsAssembly = Assembly.Load(new AssemblyName("Microsoft.AspNetCore.Mvc.Core"));
var optionsType = typeof(IOptions<>).MakeGenericType(optionsAssembly.GetType("Microsoft.AspNetCore.Mvc.JsonOptions", true));

var options = serviceProvider?.GetService(optionsType) as dynamic;
var jsonOptions = options?.Value?.JsonSerializerOptions as System.Text.Json.JsonSerializerOptions;
if (jsonOptions != null)
{
return SystemTextJsonUtilities.ConvertJsonOptionsToNewtonsoftSettings(jsonOptions);
}
}
catch
{
}
}
#endif
return new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,13 @@
<DefineConstants>$(DefineConstants);TRACE;DEBUG</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NJsonSchema" Version="10.1.11" />
<PackageReference Include="NJsonSchema" Version="10.1.14" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' != 'netcoreapp3.0' ">
<PackageReference Include="Microsoft.AspNetCore.Mvc.ApiExplorer" Version="1.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="1.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Version="1.0.3" />
</ItemGroup>
<!--<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.0' ">
<PackageReference Include="Microsoft.AspNetCore.App" Version="3.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0" />
</ItemGroup>-->
<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>

<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="xunit" Version="2.3.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\NSwag.Generation.AspNetCore\NSwag.Generation.AspNetCore.csproj" />
<ProjectReference Include="..\NSwag.AspNetCore\NSwag.AspNetCore.csproj" />
</ItemGroup>
</Project>
81 changes: 81 additions & 0 deletions src/NSwag.Generation.AspNetCore3.Tests/SystemTextJsonTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using NSwag.AspNetCore;
using NSwag.Generation.AspNetCore;
using Xunit;

namespace NSwag.Generation.AspNetCore3.Tests
{
public class SystemTextJsonTests
{
[Fact]
public async Task SystemTextJsonEnumOptionIsRead()
{
// Arrange
var services = new ServiceCollection()
.AddLogging();

services.AddControllers()
.AddJsonOptions(opt => opt.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));

services.AddOpenApiDocument();
var serviceProvider = services.BuildServiceProvider();

// Act
var generator = serviceProvider.GetRequiredService<OpenApiDocumentRegistration>();
await generator.Generator.GenerateAsync(serviceProvider);
var settings = generator.Generator.Settings;

// Assert
Assert.Contains(settings.SerializerSettings.Converters, c => c is StringEnumConverter);
}

[Fact]
public async Task SystemTextJsonCaseOptionIsRead()
{
// Arrange
var services = new ServiceCollection()
.AddLogging();

services.AddControllers()
.AddJsonOptions(opt => opt.JsonSerializerOptions.PropertyNamingPolicy = null);

services.AddOpenApiDocument();
var serviceProvider = services.BuildServiceProvider();

// Act
var generator = serviceProvider.GetRequiredService<OpenApiDocumentRegistration>();
await generator.Generator.GenerateAsync(serviceProvider);
var settings = generator.Generator.Settings;

// Assert
Assert.IsType<DefaultContractResolver>(settings.SerializerSettings.ContractResolver);
}

[Fact]
public async Task SystemTextJsonOptionDefaultsWhenNotSet()
{
// Arrange
var services = new ServiceCollection()
.AddLogging();

services.AddControllers();
services.AddOpenApiDocument();
var serviceProvider = services.BuildServiceProvider();

// Act
var generator = serviceProvider.GetRequiredService<OpenApiDocumentRegistration>();
await generator.Generator.GenerateAsync(serviceProvider);
var settings = generator.Generator.Settings;

// Assert
Assert.IsType<CamelCasePropertyNamesContractResolver>(settings.SerializerSettings.ContractResolver);
Assert.DoesNotContain(settings.SerializerSettings.Converters, c => c is StringEnumConverter);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,14 @@
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="NJsonSchema, Version=10.1.11.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
<HintPath>..\packages\NJsonSchema.10.1.11\lib\net45\NJsonSchema.dll</HintPath>
<Reference Include="NJsonSchema, Version=10.1.14.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
<HintPath>..\packages\NJsonSchema.10.1.14\lib\net45\NJsonSchema.dll</HintPath>
</Reference>
<Reference Include="NJsonSchema.CodeGeneration, Version=10.1.11.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
<HintPath>..\packages\NJsonSchema.CodeGeneration.10.1.11\lib\net451\NJsonSchema.CodeGeneration.dll</HintPath>
<Reference Include="NJsonSchema.CodeGeneration, Version=10.1.14.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
<HintPath>..\packages\NJsonSchema.CodeGeneration.10.1.14\lib\net451\NJsonSchema.CodeGeneration.dll</HintPath>
</Reference>
<Reference Include="NJsonSchema.CodeGeneration.TypeScript, Version=10.1.11.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
<HintPath>..\packages\NJsonSchema.CodeGeneration.TypeScript.10.1.11\lib\net451\NJsonSchema.CodeGeneration.TypeScript.dll</HintPath>
<Reference Include="NJsonSchema.CodeGeneration.TypeScript, Version=10.1.14.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
<HintPath>..\packages\NJsonSchema.CodeGeneration.TypeScript.10.1.14\lib\net451\NJsonSchema.CodeGeneration.TypeScript.dll</HintPath>
</Reference>
<Reference Include="Swashbuckle.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cd1bb07a5ac7c7bc, processorArchitecture=MSIL">
<HintPath>..\packages\Swashbuckle.Core.5.5.3\lib\net40\Swashbuckle.Core.dll</HintPath>
Expand Down Expand Up @@ -143,9 +143,7 @@
<Compile Include="OperationProcessors\ApiVersionProcessorWithWebApiTests.cs" />
<Compile Include="Nullability\ParameterNullabilityTests.cs" />
<Compile Include="Nullability\ResponseNullabilityTests.cs" />
<Compile Include="OperationProcessors\OpenApiQueryParametersOperationParameterProcessorTests.cs" />
<Compile Include="OperationProcessors\SwaggerOperationProcessorAttributeTests.cs" />
<Compile Include="OperationProcessors\SwaggerQueryParametersOperationParameterProcessorTests.cs" />
<Compile Include="RouteAttributeTests.cs" />
<Compile Include="EnumTests.cs" />
<Compile Include="FileParameterTests.cs" />
Expand Down
6 changes: 3 additions & 3 deletions src/NSwag.Generation.WebApi.Tests/packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net451" />
<package id="Namotion.Reflection" version="1.0.11" targetFramework="net462" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net451" />
<package id="NJsonSchema" version="10.1.11" targetFramework="net462" />
<package id="NJsonSchema.CodeGeneration" version="10.1.11" targetFramework="net462" />
<package id="NJsonSchema.CodeGeneration.TypeScript" version="10.1.11" targetFramework="net462" />
<package id="NJsonSchema" version="10.1.14" targetFramework="net462" />
<package id="NJsonSchema.CodeGeneration" version="10.1.14" targetFramework="net462" />
<package id="NJsonSchema.CodeGeneration.TypeScript" version="10.1.14" targetFramework="net462" />
<package id="Swashbuckle" version="5.5.3" targetFramework="net451" />
<package id="Swashbuckle.Core" version="5.5.3" targetFramework="net451" />
<package id="WebActivatorEx" version="2.0" targetFramework="net451" />
Expand Down
2 changes: 1 addition & 1 deletion src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
<PackageReference Include="NJsonSchema" Version="10.1.11" />
<PackageReference Include="NJsonSchema" Version="10.1.14" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
<Reference Include="Microsoft.CSharp" />
Expand Down
2 changes: 1 addition & 1 deletion src/NSwag.Generation/NSwag.Generation.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
<PackageReference Include="NJsonSchema" Version="10.1.11" />
<PackageReference Include="NJsonSchema" Version="10.1.14" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net45'">
<Reference Include="Microsoft.CSharp" />
Expand Down
5 changes: 2 additions & 3 deletions src/NSwag.Integration.WebAPI/NSwag.Integration.WebAPI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,8 @@
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="NJsonSchema, Version=10.1.11.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
<HintPath>..\packages\NJsonSchema.10.1.11\lib\net45\NJsonSchema.dll</HintPath>
<Private>True</Private>
<Reference Include="NJsonSchema, Version=10.1.14.0, Culture=neutral, PublicKeyToken=c2f9c3bdfae56102, processorArchitecture=MSIL">
<HintPath>..\packages\NJsonSchema.10.1.14\lib\net45\NJsonSchema.dll</HintPath>
</Reference>
<Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL">
<HintPath>..\packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
Expand Down
2 changes: 1 addition & 1 deletion src/NSwag.Integration.WebAPI/packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@
<package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net46" />
<package id="Namotion.Reflection" version="1.0.11" targetFramework="net46" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net451" />
<package id="NJsonSchema" version="10.1.11" targetFramework="net46" />
<package id="NJsonSchema" version="10.1.14" targetFramework="net46" />
<package id="Owin" version="1.0" targetFramework="net451" />
</packages>
Loading

0 comments on commit b2edb46

Please sign in to comment.