Unable to deserialize and then serialize SecurityScheme into JSON
- Dominant language
- Rust
- Stars
- 740
- Forks
- 127
- PR merge metrics
- No merged PRs in 30d
Description
Hi. There is problem with deserializing and then serializing security scheme into JSON. I have a code which parse spec from YAML, then attempt to serialize it into both YAML and JSON. YAML is valid, but JSON produces duplicated fields `type` and `scheme`:
```rust
use okapi::openapi3::OpenApi;
static SPEC_ROOT: &str = r##"openapi: 3.0.3
info:
title: CARDI API
version: 0.14.0
paths: {}
security:
- BasicAuth: []
components:
securitySchemes:
BasicAuth:
type: http
scheme: basic
"##;
let mut spec: OpenApi = serde_yaml::from_str(SPEC_ROOT).unwrap();
println!(
"DEBUG: {:#?}\nJSON: {}\nYAML: {}",
spec,
serde_json::to_string_pretty(&spec).unwrap(),
serde_yaml::to_string(&spec).unwrap()
);
```
Problem is that fields `type` and `scheme` ends up in both `data` and `extensions` fields. Since it looks like some serde limitation/bug, proper solution could be custom deserialization. If this approach is OK, I could try to implement it.
I believe this might be related to https://github.com/GREsau/okapi/issues/74.
## Debug output
```
DEBUG: OpenApi {
openapi: "3.0.3",
info: Info {
title: "CARDI API",
description: None,
terms_of_service: None,
contact: None,
license: None,
version: "0.14.0",
extensions: {},
},
servers: [],
paths: {},
components: Some(
Components {
schemas: {},
responses: {},
parameters: {},
examples: {},
request_bodies: {},
headers: {},
security_schemes: {
"BasicAuth": Object(
SecurityScheme {
description: None,
data: Http {
scheme: "basic",
bearer_format: None,
},
extensions: {
"scheme": String(
"basic",
),
"type": String(
"http",
),
},
},
),
},
links: {},
callbacks: {},
extensions: {},
},
),
security: [
{
"BasicAuth": [],
},
],
tags: [],
external_docs: None,
extensions: {},
}
```
## JSON output (invalid)
```json
{
"openapi": "3.0.3",
"info": {
"title": "CARDI API",
"version": "0.14.0"
},
"paths": {},
"components": {
"securitySchemes": {
"BasicAuth": {
"type": "http",
"scheme": "basic",
"scheme": "basic",
"type": "http"
}
}
},
"security": [
{
"BasicAuth": []
}
]
}
```
## YAML output (ok)
```yaml
---
openapi: 3.0.3
info:
title: CARDI API
version: 0.14.0
paths: {}
components:
securitySchemes:
BasicAuth:
scheme: basic
type: http
security:
- BasicAuth: []
```
Contributor guide
Assessment
This issue has not been assessed yet.