diff --git a/src/Microsoft.OpenApi/Any/OpenApiPrimitive.cs b/src/Microsoft.OpenApi/Any/OpenApiPrimitive.cs index fe15e8887..3ac1b0082 100644 --- a/src/Microsoft.OpenApi/Any/OpenApiPrimitive.cs +++ b/src/Microsoft.OpenApi/Any/OpenApiPrimitive.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using System; +using System.Globalization; using System.Text; using Microsoft.OpenApi.Exceptions; using Microsoft.OpenApi.Properties; @@ -74,7 +75,19 @@ public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion) case PrimitiveType.Double: var doubleValue = (OpenApiDouble)(IOpenApiPrimitive)this; - writer.WriteValue(doubleValue.Value); + var actualValue = doubleValue.Value; + if (actualValue.Equals(double.NaN) + || actualValue.Equals(double.NegativeInfinity) + || actualValue.Equals(double.PositiveInfinity)) + { + // Write out NaN, -Infinity, Infinity as strings + writer.WriteValue(actualValue.ToString(CultureInfo.InvariantCulture)); + break; + } + else + { + writer.WriteValue(actualValue); + } break; case PrimitiveType.String: diff --git a/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs b/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs index 784750ab6..f108b950a 100644 --- a/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs +++ b/test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs @@ -7,7 +7,10 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Text; using FluentAssertions; +using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Writers; using Newtonsoft.Json; using Xunit; @@ -265,5 +268,29 @@ public void WriteDateTimeAsJsonShouldMatchExpected(DateTimeOffset dateTimeOffset // Assert writtenString.Should().Be(expectedString); } + + [Fact] + public void OpenApiJsonWriterOutputsValidJsonValueWhenSchemaHasNanOrInfinityValues() + { + // Arrange + var schema = new OpenApiSchema + { + Enum = new List { + new OpenApiDouble(double.NaN), + new OpenApiDouble(double.PositiveInfinity), + new OpenApiDouble(double.NegativeInfinity) + } + }; + + // Act + var schemaBuilder = new StringBuilder(); + var jsonWriter = new OpenApiJsonWriter(new StringWriter(schemaBuilder)); + schema.SerializeAsV3(jsonWriter); + var jsonString = schemaBuilder.ToString(); + + // Assert + var exception = Record.Exception(() => System.Text.Json.JsonSerializer.Deserialize>(jsonString)); + Assert.Null(exception); + } } }