Skip to content

Commit dbe10d2

Browse files
Merge pull request #1527 from microsoft/mk/fix-json-writer-outputs-invalid-Nan-value
Fix: OpenApiJsonWriter produces non-standard JSON values when a schema has 'NaN' or 'Infinity' values
2 parents 4de9313 + 46a95c8 commit dbe10d2

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

src/Microsoft.OpenApi/Any/OpenApiPrimitive.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT license.
33

44
using System;
5+
using System.Globalization;
56
using System.Text;
67
using Microsoft.OpenApi.Exceptions;
78
using Microsoft.OpenApi.Properties;
@@ -74,7 +75,19 @@ public void Write(IOpenApiWriter writer, OpenApiSpecVersion specVersion)
7475

7576
case PrimitiveType.Double:
7677
var doubleValue = (OpenApiDouble)(IOpenApiPrimitive)this;
77-
writer.WriteValue(doubleValue.Value);
78+
var actualValue = doubleValue.Value;
79+
if (actualValue.Equals(double.NaN)
80+
|| actualValue.Equals(double.NegativeInfinity)
81+
|| actualValue.Equals(double.PositiveInfinity))
82+
{
83+
// Write out NaN, -Infinity, Infinity as strings
84+
writer.WriteValue(actualValue.ToString(CultureInfo.InvariantCulture));
85+
break;
86+
}
87+
else
88+
{
89+
writer.WriteValue(actualValue);
90+
}
7891
break;
7992

8093
case PrimitiveType.String:

test/Microsoft.OpenApi.Tests/Writers/OpenApiJsonWriterTests.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
using System.Globalization;
88
using System.IO;
99
using System.Linq;
10+
using System.Text;
1011
using FluentAssertions;
12+
using Microsoft.OpenApi.Any;
13+
using Microsoft.OpenApi.Models;
1114
using Microsoft.OpenApi.Writers;
1215
using Newtonsoft.Json;
1316
using Xunit;
@@ -265,5 +268,29 @@ public void WriteDateTimeAsJsonShouldMatchExpected(DateTimeOffset dateTimeOffset
265268
// Assert
266269
writtenString.Should().Be(expectedString);
267270
}
271+
272+
[Fact]
273+
public void OpenApiJsonWriterOutputsValidJsonValueWhenSchemaHasNanOrInfinityValues()
274+
{
275+
// Arrange
276+
var schema = new OpenApiSchema
277+
{
278+
Enum = new List<IOpenApiAny> {
279+
new OpenApiDouble(double.NaN),
280+
new OpenApiDouble(double.PositiveInfinity),
281+
new OpenApiDouble(double.NegativeInfinity)
282+
}
283+
};
284+
285+
// Act
286+
var schemaBuilder = new StringBuilder();
287+
var jsonWriter = new OpenApiJsonWriter(new StringWriter(schemaBuilder));
288+
schema.SerializeAsV3(jsonWriter);
289+
var jsonString = schemaBuilder.ToString();
290+
291+
// Assert
292+
var exception = Record.Exception(() => System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString));
293+
Assert.Null(exception);
294+
}
268295
}
269296
}

0 commit comments

Comments
 (0)