microsoft / microsoft/kiota

[Multiple languages] properties are generated as nullable/optional, despite required/nullable usage in OAS schema

Open
#3,911 61 comments 305 reactions 1 assignee Claimed by @sebastienlevert View on GitHub
Csharp enhancement Python
Dominant language
C#
Stars
3.8k
Forks
333
Avg merge
16h 29m
Merged PRs (30d)
116

Description

Kiota ignores the usage of `required`/`nullable` in OAS schemas. C# properties are always generated as nullable. This results in unneeded noisy squiggles, as shown [here](https://github.com/microsoft/kiota/issues/3846#issuecomment-1844249797).

NSwag does a better job, by performing the following translation (using the `/GenerateNullableReferenceTypes:true` switch):
- OAS non-required + nullable: C# nullable
- OAS required + nullable: C# nullable
- OAS non-required + non-nullable: C# non-nullable, unless combined with the `/GenerateOptionalPropertiesAsNullable:true` switch
- OAS required + non-nullable: C# non-nullable

Additionally, NSwag adds `[Newtonsoft.Json.JsonProperty(Required = ..., , NullValueHandling = ...)]` on the generated properties, which results in client-side serialization errors (thus avoiding a server roundtrip on invalid input).

Example component schema

```json
"exampleComponent": {
"required": [
"requiredNonNullableReferenceType",
"requiredNullableReferenceType",
"requiredNullableValueType",
"requiredValueType"
],
"type": "object",
"properties": {
"nonNullableReferenceType": {
"type": "string"
},
"requiredNonNullableReferenceType": {
"type": "string"
},
"nullableReferenceType": {
"type": "string",
"nullable": true
},
"requiredNullableReferenceType": {
"type": "string",
"nullable": true
},
"valueType": {
"type": "integer",
"format": "int32"
},
"requiredValueType": {
"type": "integer",
"format": "int32"
},
"nullableValueType": {
"type": "integer",
"format": "int32",
"nullable": true
},
"requiredNullableValueType": {
"type": "integer",
"format": "int32",
"nullable": true
}
},
"additionalProperties": false
}
```

The motivation for this behavior in Kiota is provided [here](https://github.com/microsoft/kiota/issues/3846#issuecomment-1845391214) and [here](https://github.com/microsoft/kiota/issues/3846#issuecomment-1847168478). I find it unfortunate that _correct_ server implementations have to suffer from this.

Please upvote this issue if you'd like Kiota to respect the `required`/`nullable` usage in your OAS.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.