swagger-parser
swagger-parser copied to clipboard
Swagger Converter Style and Explode inconsistency
When converting an OpenAPI 2.0 to 3.0 using the SwaggerConverter, default style and explode values are not given unless an array type is used. However, the OpenAPIDeserializer in version 3.0 will always set the parameter values based on the parameter type, as long as the content is null.
OpenAPI Deserializer
public void setStyle(String value, Parameter parameter, String location, ObjectNode obj, ParseResult result) {
if (StringUtils.isBlank(value)) {
if (QUERY_PARAMETER.equals(parameter.getIn()) || COOKIE_PARAMETER.equals(parameter.getIn())) {
parameter.setStyle(Parameter.StyleEnum.FORM);
} else if (PATH_PARAMETER.equals(parameter.getIn()) || HEADER_PARAMETER.equals(parameter.getIn())) {
parameter.setStyle(Parameter.StyleEnum.SIMPLE);
}
} else {
if (value.equals(Parameter.StyleEnum.FORM.toString())) {
parameter.setStyle(Parameter.StyleEnum.FORM);
} else if (value.equals(Parameter.StyleEnum.DEEPOBJECT.toString())) {
parameter.setStyle(Parameter.StyleEnum.DEEPOBJECT);
} else if (value.equals(Parameter.StyleEnum.LABEL.toString())) {
parameter.setStyle(Parameter.StyleEnum.LABEL);
} else if (value.equals(Parameter.StyleEnum.MATRIX.toString())) {
parameter.setStyle(Parameter.StyleEnum.MATRIX);
} else if (value.equals(Parameter.StyleEnum.PIPEDELIMITED.toString())) {
parameter.setStyle(Parameter.StyleEnum.PIPEDELIMITED);
} else if (value.equals(Parameter.StyleEnum.SIMPLE.toString())) {
parameter.setStyle(Parameter.StyleEnum.SIMPLE);
} else if (value.equals(Parameter.StyleEnum.SPACEDELIMITED.toString())) {
parameter.setStyle(Parameter.StyleEnum.SPACEDELIMITED);
} else {
result.invalidType(location, "style", "StyleEnum", obj);
}
}
}
2.0 Converter
if ("array".equals(sp.getType())) {
ArraySchema a = new ArraySchema();
// TODO: convert arrays to proper template format
String cf = sp.getCollectionFormat();
if (StringUtils.isEmpty(cf)) {
cf = "csv";
}
switch (cf) {
case "ssv":
if ("query".equals(v2Parameter.getIn())) {
v3Parameter.setStyle(Parameter.StyleEnum.SPACEDELIMITED);
}
break;
case "pipes":
if ("query".equals(v2Parameter.getIn())) {
v3Parameter.setStyle((Parameter.StyleEnum.PIPEDELIMITED));
}
break;
case "tsv":
break;
case "multi":
if ("query".equals(v2Parameter.getIn())) {
v3Parameter.setStyle(Parameter.StyleEnum.FORM);
v3Parameter.setExplode(true);
}
break;
case "csv":
default:
if ("query".equals(v2Parameter.getIn())) {
v3Parameter.setStyle(Parameter.StyleEnum.FORM);
v3Parameter.setExplode(false);
} else if ("header".equals(v2Parameter.getIn()) || "path".equals(v2Parameter.getIn())) {
v3Parameter.setStyle(Parameter.StyleEnum.SIMPLE);
v3Parameter.setExplode(false);
}
}
In the 3.x parser, a query parameter with no style specified and no content always has explode=true which seems wrong when the parameter schema is a simple non-array type like boolean.
Hi @klam2010 Have you tried to use SwaggerConverter with set "Flatten" option to true in ParseOptions ? It should meet you expectations. Meanwhile i will close this ticket, if you will have any questions feel free to reopen.
Hi @klease Basically it comes out from OpenApi specification. Explode will be always set to true by default if style=form and style is set to form by default if in=query.