diff --git a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs
index 97edce131..03b465109 100644
--- a/src/Microsoft.OpenApi/Models/OpenApiParameter.cs
+++ b/src/Microsoft.OpenApi/Models/OpenApiParameter.cs
@@ -14,6 +14,8 @@ namespace Microsoft.OpenApi.Models
///
public class OpenApiParameter : IOpenApiSerializable, IOpenApiReferenceable, IOpenApiExtensible
{
+ private bool? _explode;
+
///
/// Indicates if object is populated with data or is just a reference to the data
///
@@ -79,7 +81,11 @@ public class OpenApiParameter : IOpenApiSerializable, IOpenApiReferenceable, IOp
/// When style is form, the default value is true.
/// For all other styles, the default value is false.
///
- public bool Explode { get; set; }
+ public bool Explode
+ {
+ get => _explode ?? Style == ParameterStyle.Form;
+ set => _explode = value;
+ }
///
/// Determines whether the parameter value SHOULD allow reserved characters,
diff --git a/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs b/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs
index f37d18ed7..b630f3126 100644
--- a/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs
+++ b/test/Microsoft.OpenApi.Tests/Models/OpenApiParameterTests.cs
@@ -163,6 +163,24 @@ public OpenApiParameterTests(ITestOutputHelper output)
_output = output;
}
+ [Theory]
+ [InlineData(ParameterStyle.Form, true)]
+ [InlineData(ParameterStyle.SpaceDelimited, false)]
+ [InlineData(null, false)]
+ public void WhenStyleIsFormTheDefaultValueOfExplodeShouldBeTrueOtherwiseFalse(ParameterStyle? style, bool expectedExplode)
+ {
+ // Arrange
+ var parameter = new OpenApiParameter
+ {
+ Name = "name1",
+ In = ParameterLocation.Query,
+ Style = style
+ };
+
+ // Act & Assert
+ parameter.Explode.Should().Be(expectedExplode);
+ }
+
[Fact]
public void SerializeBasicParameterAsV3JsonWorks()
{