diff --git a/src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs b/src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs index fd2ff1387..639d42ef6 100644 --- a/src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs +++ b/src/Microsoft.OpenApi/Writers/OpenApiWriterAnyExtensions.cs @@ -68,13 +68,13 @@ public static void WriteAny(this IOpenApiWriter writer, JsonNode node) writer.WriteObject(node as JsonObject); break; case JsonValueKind.String: // Primitive - writer.WritePrimitive(node); + writer.WriteValue(node.GetValue()); break; case JsonValueKind.Number: // Primitive - writer.WritePrimitive(node); + writer.WriteNumber(node); break; case JsonValueKind.True or JsonValueKind.False: // Primitive - writer.WritePrimitive(node); + writer.WriteValue(node.GetValue()); break; case JsonValueKind.Null: // null writer.WriteNull(); @@ -109,43 +109,10 @@ private static void WriteObject(this IOpenApiWriter writer, JsonObject entity) writer.WriteEndObject(); } - private static void WritePrimitive(this IOpenApiWriter writer, JsonNode primitive) + private static void WriteNumber(this IOpenApiWriter writer, JsonNode number) { - Utils.CheckArgumentNull(writer); - - var valueKind = primitive.GetValueKind(); - - if (valueKind == JsonValueKind.String && primitive is JsonValue jsonStrValue) + if (number is JsonValue jsonValue) { - if (jsonStrValue.TryGetValue(out var dto)) - { - writer.WriteValue(dto); - } - else if (jsonStrValue.TryGetValue(out var dt)) - { - writer.WriteValue(dt); - } - else if (jsonStrValue.TryGetValue(out var strValue)) - { - // check whether string is actual string or date time object - if (DateTimeOffset.TryParse(strValue, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset)) - { - writer.WriteValue(dateTimeOffset); - } - else if (DateTime.TryParse(strValue, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTime)) - { // order matters, DTO needs to be checked first!!! - writer.WriteValue(dateTime); - } - else - { - writer.WriteValue(strValue); - } - } - } - - else if (valueKind == JsonValueKind.Number && primitive is JsonValue jsonValue) - { - if (jsonValue.TryGetValue(out var decimalValue)) { writer.WriteValue(decimalValue); @@ -167,14 +134,6 @@ private static void WritePrimitive(this IOpenApiWriter writer, JsonNode primitiv writer.WriteValue(intValue); } } - else if (valueKind is JsonValueKind.False) - { - writer.WriteValue(false); - } - else if (valueKind is JsonValueKind.True) - { - writer.WriteValue(true); - } } } } diff --git a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs index 555b71c54..e220df055 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/V31Tests/OpenApiSchemaTests.cs @@ -520,5 +520,41 @@ public void ParseSchemaWithUnrecognizedKeywordsWorks() Assert.Equal(2, schema.UnrecognizedKeywords.Count); } + [Fact] + public void ParseSchemaExampleWithPrimitivesWorks() + { + var expected1 = @"{ + ""type"": ""string"", + ""example"": ""2024-01-02"" +}"; + + var expected2 = @"{ + ""type"": ""string"", + ""example"": ""3.14"" +}"; + var schema = new OpenApiSchema() + { + Type = JsonSchemaType.String, + Example = JsonValue.Create("2024-01-02") + }; + + var schema2 = new OpenApiSchema() + { + Type = JsonSchemaType.String, + Example = JsonValue.Create("3.14") + }; + + var textWriter = new StringWriter(); + var writer = new OpenApiJsonWriter(textWriter); + schema.SerializeAsV31(writer); + var actual1 = textWriter.ToString(); + Assert.Equal(expected1.MakeLineBreaksEnvironmentNeutral(), actual1.MakeLineBreaksEnvironmentNeutral()); + + textWriter = new StringWriter(); + writer = new OpenApiJsonWriter(textWriter); + schema2.SerializeAsV31(writer); + var actual2 = textWriter.ToString(); + Assert.Equal(expected2.MakeLineBreaksEnvironmentNeutral(), actual2.MakeLineBreaksEnvironmentNeutral()); + } } } diff --git a/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs b/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs index 2e05a70a3..149797e14 100644 --- a/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs +++ b/test/Microsoft.OpenApi.Tests/Writers/OpenApiWriterAnyExtensionsTests.cs @@ -164,12 +164,8 @@ from shouldBeTerse in shouldProduceTerseOutputValues [MemberData(nameof(StringifiedDateTimes))] public async Task WriteOpenApiDateTimeAsJsonWorksAsync(string inputString, bool produceTerseOutput) { - // Arrange - var input = DateTimeOffset.Parse(inputString, CultureInfo.InvariantCulture); - var dateTimeValue = input; - - var json = await WriteAsJsonAsync(dateTimeValue, produceTerseOutput); - var expectedJson = "\"" + input.ToString("o") + "\""; + var json = await WriteAsJsonAsync(inputString, produceTerseOutput); + var expectedJson = "\"" + inputString + "\""; // Assert Assert.Equal(expectedJson, json);