Skip to content

Commit edf3c67

Browse files
committed
fix: serialize examples as extension in v2/v3
1 parent f2b9aa5 commit edf3c67

4 files changed

Lines changed: 63 additions & 0 deletions

File tree

src/Microsoft.OpenApi/Models/OpenApiConstants.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -805,6 +805,11 @@ public static class OpenApiConstants
805805
/// </summary>
806806
public const string ExamplesExtension = "x-examples";
807807

808+
/// <summary>
809+
/// Extension: x-jsonschema-examples
810+
/// </summary>
811+
public const string JsonSchemaExamplesExtension = "x-jsonschema-examples";
812+
808813
/// <summary>
809814
/// Field: version3_0_0
810815
/// </summary>

src/Microsoft.OpenApi/Models/OpenApiSchema.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,7 @@ private void WriteV3CompatibilityKeywords(IOpenApiWriter writer, Action<IOpenApi
746746
writer.WriteOptionalObject(OpenApiConstants.IfExtension, If, callback);
747747
writer.WriteOptionalObject(OpenApiConstants.ThenExtension, Then, callback);
748748
writer.WriteOptionalObject(OpenApiConstants.ElseExtension, Else, callback);
749+
writer.WriteOptionalCollection(OpenApiConstants.JsonSchemaExamplesExtension, Examples, (nodeWriter, s) => nodeWriter.WriteAny(s));
749750
}
750751

751752
internal void WriteAsItemsProperties(IOpenApiWriter writer)
@@ -990,6 +991,8 @@ private void SerializeAsV2(
990991
writer.WriteOptionalMap(OpenApiConstants.PatternPropertiesExtension, PatternProperties, (w, s) => s.SerializeAsV2(w));
991992
}
992993

994+
writer.WriteOptionalCollection(OpenApiConstants.JsonSchemaExamplesExtension, Examples, (nodeWriter, s) => nodeWriter.WriteAny(s));
995+
993996
// extensions
994997
writer.WriteExtensions(Extensions, OpenApiSpecVersion.OpenApi2_0);
995998

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
#nullable enable
2+
const Microsoft.OpenApi.OpenApiConstants.JsonSchemaExamplesExtension = "x-jsonschema-examples" -> string!

test/Microsoft.OpenApi.Tests/Models/OpenApiSchemaTests.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,60 @@ public async Task SerializePatternPropertiesAsExtensionInEarlierVersions(OpenApi
17521752
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
17531753
}
17541754

1755+
[Theory]
1756+
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
1757+
[InlineData(OpenApiSpecVersion.OpenApi3_0)]
1758+
public async Task SerializeExamplesAsExtensionInEarlierVersions(OpenApiSpecVersion version)
1759+
{
1760+
var expected = """
1761+
{
1762+
"x-jsonschema-examples": [
1763+
"example value",
1764+
42
1765+
]
1766+
}
1767+
""";
1768+
var schema = new OpenApiSchema
1769+
{
1770+
Examples =
1771+
[
1772+
JsonValue.Create("example value")!,
1773+
JsonValue.Create(42)!
1774+
]
1775+
};
1776+
1777+
var actual = await schema.SerializeAsJsonAsync(version);
1778+
1779+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
1780+
}
1781+
1782+
[Theory]
1783+
[InlineData(OpenApiSpecVersion.OpenApi3_1)]
1784+
[InlineData(OpenApiSpecVersion.OpenApi3_2)]
1785+
public async Task SerializeExamplesAsJsonSchemaKeywordInV31AndLater(OpenApiSpecVersion version)
1786+
{
1787+
var expected = """
1788+
{
1789+
"examples": [
1790+
"example value",
1791+
42
1792+
]
1793+
}
1794+
""";
1795+
var schema = new OpenApiSchema
1796+
{
1797+
Examples =
1798+
[
1799+
JsonValue.Create("example value")!,
1800+
JsonValue.Create(42)!
1801+
]
1802+
};
1803+
1804+
var actual = await schema.SerializeAsJsonAsync(version);
1805+
1806+
Assert.True(JsonNode.DeepEquals(JsonNode.Parse(expected), JsonNode.Parse(actual)));
1807+
}
1808+
17551809
[Theory]
17561810
[InlineData(OpenApiSpecVersion.OpenApi2_0)]
17571811
[InlineData(OpenApiSpecVersion.OpenApi3_0)]

0 commit comments

Comments
 (0)