From c642c644777e2e668ca16459304127af366e22ba Mon Sep 17 00:00:00 2001 From: Andrey Markelov Date: Tue, 3 Nov 2026 09:57:49 -0800 Subject: [PATCH 1/2] fix(csharp): serialize object oneOf variants --- .../generichost/JsonConverter.mustache | 16 +++++++++ ...harpGenericHostOneOfSerializationTest.java | 32 +++++++++++++++++ .../csharp/oneof-object-serialization.yaml | 27 +++++++++++++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../OneOfSerializationRegressionTests.cs | 34 +++++++++++++++++++ .../OneOf/src/Org.OpenAPITools/Model/Fruit.cs | 18 ++++++++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../OneOf/src/Org.OpenAPITools/Model/Fruit.cs | 18 ++++++++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../OneOf/src/Org.OpenAPITools/Model/Fruit.cs | 18 ++++++++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../OneOf/src/Org.OpenAPITools/Model/Fruit.cs | 18 ++++++++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../OneOf/src/Org.OpenAPITools/Model/Fruit.cs | 18 ++++++++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ .../src/Org.OpenAPITools/Model/Fruit.cs | 12 +++++++ .../src/Org.OpenAPITools/Model/FruitReq.cs | 12 +++++++ .../Model/MixedOneOfContent.cs | 6 ++++ 63 files changed, 739 insertions(+) create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpGenericHostOneOfSerializationTest.java create mode 100644 modules/openapi-generator/src/test/resources/3_0/csharp/oneof-object-serialization.yaml create mode 100644 samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools.Test/Model/OneOfSerializationRegressionTests.cs diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/JsonConverter.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/JsonConverter.mustache index e25293818a3a..7c357d6087ba 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/JsonConverter.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/JsonConverter.mustache @@ -420,6 +420,22 @@ {{/model.discriminator}} {{^model.discriminator}} {{#composedSchemas}} + {{#oneOf}} + {{^vendorExtensions.x-duplicated-data-type}} + {{^isPrimitiveType}} + {{^isArray}} + {{^isMap}} + if ({{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}} != null) + { + {{baseType}}JsonConverter converter = ({{baseType}}JsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof({{baseType}}))); + converter.WriteProperties(writer, {{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}, jsonSerializerOptions); + } + + {{/isMap}} + {{/isArray}} + {{/isPrimitiveType}} + {{/vendorExtensions.x-duplicated-data-type}} + {{/oneOf}} {{#anyOf}} if ({{#lambda.joinWithAmpersand}}{{^required}}{{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}Option.IsSet {{/required}}{{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}{{^required}}Option.Value{{/required}} != null{{/lambda.joinWithAmpersand}}) {{#isPrimitiveType}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpGenericHostOneOfSerializationTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpGenericHostOneOfSerializationTest.java new file mode 100644 index 000000000000..a6d0d6477704 --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpGenericHostOneOfSerializationTest.java @@ -0,0 +1,32 @@ +/* + * Copyright 2026 OpenAPI-Generator Contributors (https://openapi-generator.tech) + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.openapitools.codegen.csharpnetcore; + +import org.openapitools.codegen.DefaultGenerator; +import org.openapitools.codegen.config.CodegenConfigurator; +import org.testng.annotations.Test; + +import java.nio.file.Path; + +import static org.openapitools.codegen.TestUtils.assertFileContains; +import static org.openapitools.codegen.TestUtils.newTempFolder; + +public class CSharpGenericHostOneOfSerializationTest { + @Test + public void testObjectOneOfWithoutDiscriminatorWritesVariant() throws Exception { + Path output = newTempFolder(); + CodegenConfigurator config = new CodegenConfigurator().setGeneratorName("csharp").setLibrary("generichost") + .setInputSpec("src/test/resources/3_0/csharp/oneof-object-serialization.yaml") + .setOutputDir(output.toString()).addAdditionalProperty("packageName", "OneOfRepro"); + new DefaultGenerator().opts(config.toClientOptInput()).generate(); + assertFileContains(output.resolve("src/OneOfRepro/Model/Entry.cs"), + "if (entry.FileEntry != null)", + "converter.WriteProperties(writer, entry.FileEntry, jsonSerializerOptions);", + "if (entry.FolderEntry != null)", + "converter.WriteProperties(writer, entry.FolderEntry, jsonSerializerOptions);"); + } +} diff --git a/modules/openapi-generator/src/test/resources/3_0/csharp/oneof-object-serialization.yaml b/modules/openapi-generator/src/test/resources/3_0/csharp/oneof-object-serialization.yaml new file mode 100644 index 000000000000..f95ff7beb9bd --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/csharp/oneof-object-serialization.yaml @@ -0,0 +1,27 @@ +openapi: 3.0.3 +info: + title: oneOf reproduction + version: 1.0.0 +paths: {} +components: + schemas: + Entry: + oneOf: + - $ref: '#/components/schemas/FileEntry' + - $ref: '#/components/schemas/FolderEntry' + FileEntry: + type: object + required: [name, size] + properties: + name: + type: string + size: + type: integer + FolderEntry: + type: object + required: [name, id] + properties: + name: + type: string + id: + type: string diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/Fruit.cs index 243215e72240..1010b6fe7861 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/Fruit.cs @@ -205,6 +205,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/FruitReq.cs index b28dc4d8ed56..a51d2a619485 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/FruitReq.cs @@ -179,6 +179,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 9dc1bb0487da..01b3864f2ff4 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -245,6 +245,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/Fruit.cs index 784b5dc9af79..278ec341e5a4 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs index a4308c32d8b6..3a8961d81398 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs @@ -206,6 +206,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs index d561a09a3804..ae8e0b25a148 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs @@ -180,6 +180,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 6811c075b9ca..74488c4f2078 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -253,6 +253,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools.Test/Model/OneOfSerializationRegressionTests.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools.Test/Model/OneOfSerializationRegressionTests.cs new file mode 100644 index 000000000000..14cd47812f6e --- /dev/null +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools.Test/Model/OneOfSerializationRegressionTests.cs @@ -0,0 +1,34 @@ +using System.Text.Json; +using Microsoft.Extensions.DependencyInjection; +using Org.OpenAPITools.Client; +using Org.OpenAPITools.Model; +using Xunit; + +namespace Org.OpenAPITools.Test.Model +{ + public class OneOfSerializationRegressionTests + { + [Fact] + public void WritesActiveObjectVariantAndWrapperProperties() + { + JsonSerializerOptions? options = null; + new HostConfiguration(new ServiceCollection()).ConfigureJsonOptions(value => options = value); + Assert.NotNull(options); + Fruit fruit = JsonSerializer.Deserialize("{\"kind\":\"gala\",\"color\":\"red\"}", options)!; + Assert.NotNull(fruit.Apple); + using (JsonDocument json = JsonDocument.Parse(JsonSerializer.Serialize(fruit, options))) + { + Assert.Equal("gala", json.RootElement.GetProperty("kind").GetString()); + Assert.Equal("red", json.RootElement.GetProperty("color").GetString()); + } + + fruit.Apple = null; + fruit.Banana = new Banana { Count = 2 }; + using (JsonDocument json = JsonDocument.Parse(JsonSerializer.Serialize(fruit, options))) + { + Assert.Equal(2, json.RootElement.GetProperty("count").GetInt32()); + Assert.Equal("red", json.RootElement.GetProperty("color").GetString()); + } + } + } +} diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Model/Fruit.cs index ba9946bc000b..0baa3d46564f 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Model/Fruit.cs @@ -237,6 +237,24 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + + if (fruit.Orange != null) + { + OrangeJsonConverter converter = (OrangeJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Orange))); + converter.WriteProperties(writer, fruit.Orange, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index 784b5dc9af79..278ec341e5a4 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs index faa29c9f5d95..1ab6928be39a 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs @@ -207,6 +207,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs index 055e99668c60..35343e52bd02 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs @@ -181,6 +181,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 8ef84d0e9496..86177c4f6824 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -254,6 +254,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/Fruit.cs index ba7eb93c2ec2..becd99ba38c4 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Model/Fruit.cs index 0d2df9da3d80..828fdb6b8cb4 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Model/Fruit.cs @@ -235,6 +235,24 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + + if (fruit.Orange != null) + { + OrangeJsonConverter converter = (OrangeJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Orange))); + converter.WriteProperties(writer, fruit.Orange, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index ba7eb93c2ec2..becd99ba38c4 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs index ba7eb93c2ec2..becd99ba38c4 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs index 0d2df9da3d80..828fdb6b8cb4 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs @@ -235,6 +235,24 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + + if (fruit.Orange != null) + { + OrangeJsonConverter converter = (OrangeJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Orange))); + converter.WriteProperties(writer, fruit.Orange, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index ba7eb93c2ec2..becd99ba38c4 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs index 784b5dc9af79..278ec341e5a4 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs index a4308c32d8b6..3a8961d81398 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs @@ -206,6 +206,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs index d561a09a3804..ae8e0b25a148 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs @@ -180,6 +180,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 6811c075b9ca..74488c4f2078 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -253,6 +253,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs index ba9946bc000b..0baa3d46564f 100644 --- a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs @@ -237,6 +237,24 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + + if (fruit.Orange != null) + { + OrangeJsonConverter converter = (OrangeJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Orange))); + converter.WriteProperties(writer, fruit.Orange, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index 784b5dc9af79..278ec341e5a4 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs index faa29c9f5d95..1ab6928be39a 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs @@ -207,6 +207,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs index 055e99668c60..35343e52bd02 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs @@ -181,6 +181,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 8ef84d0e9496..86177c4f6824 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -254,6 +254,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/Fruit.cs index 784b5dc9af79..278ec341e5a4 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs index a4308c32d8b6..3a8961d81398 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs @@ -206,6 +206,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs index d561a09a3804..ae8e0b25a148 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs @@ -180,6 +180,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 6811c075b9ca..74488c4f2078 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -253,6 +253,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Model/Fruit.cs index ba9946bc000b..0baa3d46564f 100644 --- a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Model/Fruit.cs @@ -237,6 +237,24 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + + if (fruit.Orange != null) + { + OrangeJsonConverter converter = (OrangeJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Orange))); + converter.WriteProperties(writer, fruit.Orange, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index 784b5dc9af79..278ec341e5a4 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs index faa29c9f5d95..1ab6928be39a 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs @@ -207,6 +207,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs index 055e99668c60..35343e52bd02 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs @@ -181,6 +181,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 8ef84d0e9496..86177c4f6824 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -254,6 +254,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index ba7eb93c2ec2..becd99ba38c4 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,6 +204,18 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + if (fruit.Apple != null) + { + AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); + converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + } + + if (fruit.Banana != null) + { + BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); + converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + } + WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 88686dd4a32e..5fe1498b5d6e 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,6 +178,18 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + if (fruitReq.AppleReq != null) + { + AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); + converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + } + + if (fruitReq.BananaReq != null) + { + BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); + converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + } + WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 65ed21f4c667..a28ca47d9ce3 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,6 +251,12 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + if (mixedOneOfContent.MixedSubId != null) + { + MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); + converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + } + WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } From 233f8382b8e8792bd9993d2a5facf9f501089222 Mon Sep 17 00:00:00 2001 From: Andrey Markelov Date: Wed, 4 Nov 2026 09:43:03 -0800 Subject: [PATCH 2/2] fix(csharp): address oneOf serialization review --- .../csharp-generichost-net10-oneOf.yaml | 6 +- .../generichost/JsonConverter.mustache | 25 ++++- ...harpGenericHostOneOfSerializationTest.java | 4 +- .../OneOfSerializationRegressionTests.cs | 106 ++++++++++++++++++ .../Model/OneOfNullableTest.cs | 2 + .../ParentWithPluralOneOfPropertyNumber.cs | 2 + .../Model/OneOfArrayRequest.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../net10/OneOf/.openapi-generator/FILES | 1 + .../OneOfSerializationRegressionTests.cs | 72 ++++++++++++ .../OneOf/src/Org.OpenAPITools/Model/Fruit.cs | 59 +++++++++- .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../OneOf/src/Org.OpenAPITools/Model/Fruit.cs | 59 +++++++++- .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../OneOf/src/Org.OpenAPITools/Model/Fruit.cs | 59 +++++++++- .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../OneOf/src/Org.OpenAPITools/Model/Fruit.cs | 59 +++++++++- .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../OneOf/src/Org.OpenAPITools/Model/Fruit.cs | 59 +++++++++- .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + .../src/Org.OpenAPITools/Model/Fruit.cs | 40 ++++++- .../src/Org.OpenAPITools/Model/FruitReq.cs | 40 ++++++- .../Model/MixedOneOfContent.cs | 21 +++- .../src/Org.OpenAPITools/Model/OneOfString.cs | 2 + .../Model/PolymorphicProperty.cs | 2 + 104 files changed, 2190 insertions(+), 215 deletions(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/csharp/oneof-runtime/OneOfSerializationRegressionTests.cs diff --git a/bin/configs/csharp-generichost-net10-oneOf.yaml b/bin/configs/csharp-generichost-net10-oneOf.yaml index 333f4f1824e5..664abc4fb929 100644 --- a/bin/configs/csharp-generichost-net10-oneOf.yaml +++ b/bin/configs/csharp-generichost-net10-oneOf.yaml @@ -2,7 +2,7 @@ generatorName: csharp outputDir: samples/client/petstore/csharp/generichost/net10/OneOf inputSpec: modules/openapi-generator/src/test/resources/3_0/oneOf.yaml -templateDir: modules/openapi-generator/src/main/resources/csharp +templateDir: modules/openapi-generator/src/test/resources/3_0/csharp/oneof-runtime additionalProperties: packageGuid: '{321C8C3F-0156-40C1-AE42-D59761FB9B6C}' useCompareNetObjects: true @@ -14,3 +14,7 @@ additionalProperties: operationParameterSorting: alphabetical treatWarningsAsErrors: true warningsNotAsErrors: CS0612 + +files: + OneOfSerializationRegressionTests.cs: + destinationFilename: src/Org.OpenAPITools.Test/Model/OneOfSerializationRegressionTests.cs diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/JsonConverter.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/JsonConverter.mustache index 7c357d6087ba..b00a6c62b2bc 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/JsonConverter.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/generichost/JsonConverter.mustache @@ -421,20 +421,41 @@ {{^model.discriminator}} {{#composedSchemas}} {{#oneOf}} + {{#-first}} + bool oneOfValueWritten = false; + {{/-first}} {{^vendorExtensions.x-duplicated-data-type}} {{^isPrimitiveType}} {{^isArray}} {{^isMap}} if ({{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}} != null) { - {{baseType}}JsonConverter converter = ({{baseType}}JsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof({{baseType}}))); - converter.WriteProperties(writer, {{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for {{model.classname}}."); + oneOfValueWritten = true; + var variant = {{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new {{baseType}}JsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } {{/isMap}} {{/isArray}} {{/isPrimitiveType}} {{/vendorExtensions.x-duplicated-data-type}} + {{#-last}} + _ = oneOfValueWritten; + {{/-last}} {{/oneOf}} {{#anyOf}} if ({{#lambda.joinWithAmpersand}}{{^required}}{{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}Option.IsSet {{/required}}{{#lambda.camelcase_sanitize_param}}{{model.classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}{{^required}}Option.Value{{/required}} != null{{/lambda.joinWithAmpersand}}) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpGenericHostOneOfSerializationTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpGenericHostOneOfSerializationTest.java index a6d0d6477704..6be5763e6070 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpGenericHostOneOfSerializationTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/csharpnetcore/CSharpGenericHostOneOfSerializationTest.java @@ -25,8 +25,8 @@ public void testObjectOneOfWithoutDiscriminatorWritesVariant() throws Exception new DefaultGenerator().opts(config.toClientOptInput()).generate(); assertFileContains(output.resolve("src/OneOfRepro/Model/Entry.cs"), "if (entry.FileEntry != null)", - "converter.WriteProperties(writer, entry.FileEntry, jsonSerializerOptions);", + "JsonSerializer.Serialize(variant, variant.GetType(), variantOptions)", "if (entry.FolderEntry != null)", - "converter.WriteProperties(writer, entry.FolderEntry, jsonSerializerOptions);"); + "Multiple oneOf variants are set for Entry."); } } diff --git a/modules/openapi-generator/src/test/resources/3_0/csharp/oneof-runtime/OneOfSerializationRegressionTests.cs b/modules/openapi-generator/src/test/resources/3_0/csharp/oneof-runtime/OneOfSerializationRegressionTests.cs new file mode 100644 index 000000000000..5d63334951e2 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/csharp/oneof-runtime/OneOfSerializationRegressionTests.cs @@ -0,0 +1,106 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; +using Microsoft.Extensions.DependencyInjection; +using Org.OpenAPITools.Client; +using Org.OpenAPITools.Model; +using Xunit; + +namespace Org.OpenAPITools.Test.Model +{ + public class OneOfSerializationRegressionTests + { + [Fact] + public void WritesActiveObjectVariantAndWrapperProperties() + { + JsonSerializerOptions? options = null; + new HostConfiguration(new ServiceCollection()).ConfigureJsonOptions(value => options = value); + Assert.NotNull(options); + Fruit fruit = JsonSerializer.Deserialize("{\"kind\":\"gala\",\"color\":\"red\"}", options)!; + Assert.NotNull(fruit.Apple); + using (JsonDocument json = JsonDocument.Parse(JsonSerializer.Serialize(fruit, options))) + { + Assert.Equal("gala", json.RootElement.GetProperty("kind").GetString()); + Assert.Equal("red", json.RootElement.GetProperty("color").GetString()); + } + + fruit.Apple = null; + fruit.Banana = new Banana { Count = 2 }; + using (JsonDocument json = JsonDocument.Parse(JsonSerializer.Serialize(fruit, options))) + { + Assert.Equal(2, json.RootElement.GetProperty("count").GetInt32()); + Assert.Equal("red", json.RootElement.GetProperty("color").GetString()); + } + } + + private static Fruit CreateFruit() + { + JsonSerializerOptions? options = null; + new HostConfiguration(new ServiceCollection()).ConfigureJsonOptions(value => options = value); + return JsonSerializer.Deserialize("{\"kind\":\"gala\"}", options!)!; + } + + [Fact] + public void RejectsMultipleVariants() + { + Fruit fruit = CreateFruit(); + fruit.Banana = new Banana { Count = 2 }; + var options = new JsonSerializerOptions(); + options.Converters.Add(new FruitJsonConverter()); + Assert.Throws(() => JsonSerializer.Serialize(fruit, options)); + } + + [Fact] + public void UsesGeneratedVariantConverterWhenNotRegistered() + { + Fruit fruit = CreateFruit(); + var options = new JsonSerializerOptions(); + options.Converters.Add(new FruitJsonConverter()); + using JsonDocument json = JsonDocument.Parse(JsonSerializer.Serialize(fruit, options)); + Assert.Equal("gala", json.RootElement.GetProperty("kind").GetString()); + } + + [Fact] + public void UsesCustomVariantConverter() + { + Fruit fruit = CreateFruit(); + var options = new JsonSerializerOptions(); + options.Converters.Add(new FruitJsonConverter()); + options.Converters.Add(new CustomAppleConverter()); + using JsonDocument json = JsonDocument.Parse(JsonSerializer.Serialize(fruit, options)); + Assert.Equal("custom", json.RootElement.GetProperty("kind").GetString()); + } + + [Fact] + public void UsesDerivedVariantConverter() + { + Fruit fruit = CreateFruit(); + fruit.Apple = new FancyApple(); + var options = new JsonSerializerOptions(); + options.Converters.Add(new FruitJsonConverter()); + options.Converters.Add(new FancyAppleConverter()); + using JsonDocument json = JsonDocument.Parse(JsonSerializer.Serialize(fruit, options)); + Assert.Equal("fancy", json.RootElement.GetProperty("extra").GetString()); + } + + private sealed class CustomAppleConverter : JsonConverter + { + public override Apple Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options) => throw new NotSupportedException(); + public override void Write(Utf8JsonWriter writer, Apple value, JsonSerializerOptions options) + { + writer.WriteStartObject(); writer.WriteString("kind", "custom"); writer.WriteEndObject(); + } + } + + private sealed class FancyApple : Apple { } + + private sealed class FancyAppleConverter : JsonConverter + { + public override FancyApple Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options) => throw new NotSupportedException(); + public override void Write(Utf8JsonWriter writer, FancyApple value, JsonSerializerOptions options) + { + writer.WriteStartObject(); writer.WriteString("extra", "fancy"); writer.WriteEndObject(); + } + } + } +} diff --git a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Model/OneOfNullableTest.cs b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Model/OneOfNullableTest.cs index e76a910a98a3..942e0bd9921a 100644 --- a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Model/OneOfNullableTest.cs +++ b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Model/OneOfNullableTest.cs @@ -180,6 +180,8 @@ public override void Write(Utf8JsonWriter writer, OneOfNullableTest oneOfNullabl { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfNullableTest, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Model/ParentWithPluralOneOfPropertyNumber.cs b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Model/ParentWithPluralOneOfPropertyNumber.cs index 3a399c5024a7..ded7d497b04b 100644 --- a/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Model/ParentWithPluralOneOfPropertyNumber.cs +++ b/samples/client/petstore/csharp/generichost/latest/AnnotatedEnum/src/Org.OpenAPITools/Model/ParentWithPluralOneOfPropertyNumber.cs @@ -179,6 +179,8 @@ public override void Write(Utf8JsonWriter writer, ParentWithPluralOneOfPropertyN { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, parentWithPluralOneOfPropertyNumber, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Model/OneOfArrayRequest.cs b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Model/OneOfArrayRequest.cs index 5234000d9fa2..45a1061993aa 100644 --- a/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Model/OneOfArrayRequest.cs +++ b/samples/client/petstore/csharp/generichost/latest/OneOfList/src/Org.OpenAPITools/Model/OneOfArrayRequest.cs @@ -179,6 +179,8 @@ public override void Write(Utf8JsonWriter writer, OneOfArrayRequest oneOfArrayRe { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfArrayRequest, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/Fruit.cs index 1010b6fe7861..236a922f0a50 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/Fruit.cs @@ -205,18 +205,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/FruitReq.cs index a51d2a619485..a51ce8ec8b10 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/FruitReq.cs @@ -179,18 +179,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 01b3864f2ff4..4081d0deb485 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -245,12 +245,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/OneOfString.cs index 7cc7a1520b56..cc39edb01647 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/OneOfString.cs @@ -141,6 +141,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index eb6f31431a7a..508e225041e6 100644 --- a/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/latest/UseDateTimeOffset/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -223,6 +223,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/Fruit.cs index 278ec341e5a4..a66ccc841790 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net10/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs index 3a8961d81398..da3ff8c39e18 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs @@ -206,18 +206,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs index ae8e0b25a148..9a06acffd3d1 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs @@ -180,18 +180,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 74488c4f2078..f7c8e2a305df 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -253,12 +253,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs index 29000bb7adad..38bb5a08d5b6 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs @@ -149,6 +149,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index c5c884525043..65bdbc127569 100644 --- a/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net10/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -231,6 +231,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/.openapi-generator/FILES b/samples/client/petstore/csharp/generichost/net10/OneOf/.openapi-generator/FILES index 86967a0a29dd..d798e4dd1593 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/.openapi-generator/FILES +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/.openapi-generator/FILES @@ -11,6 +11,7 @@ docs/models/Orange.md docs/scripts/git_push.ps1 docs/scripts/git_push.sh src/Org.OpenAPITools.Test/Api/DependencyInjectionTests.cs +src/Org.OpenAPITools.Test/Model/OneOfSerializationRegressionTests.cs src/Org.OpenAPITools.Test/Org.OpenAPITools.Test.csproj src/Org.OpenAPITools.Test/README.md src/Org.OpenAPITools/Api/DefaultApi.cs diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools.Test/Model/OneOfSerializationRegressionTests.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools.Test/Model/OneOfSerializationRegressionTests.cs index 14cd47812f6e..5d63334951e2 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools.Test/Model/OneOfSerializationRegressionTests.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools.Test/Model/OneOfSerializationRegressionTests.cs @@ -1,4 +1,6 @@ +using System; using System.Text.Json; +using System.Text.Json.Serialization; using Microsoft.Extensions.DependencyInjection; using Org.OpenAPITools.Client; using Org.OpenAPITools.Model; @@ -30,5 +32,75 @@ public void WritesActiveObjectVariantAndWrapperProperties() Assert.Equal("red", json.RootElement.GetProperty("color").GetString()); } } + + private static Fruit CreateFruit() + { + JsonSerializerOptions? options = null; + new HostConfiguration(new ServiceCollection()).ConfigureJsonOptions(value => options = value); + return JsonSerializer.Deserialize("{\"kind\":\"gala\"}", options!)!; + } + + [Fact] + public void RejectsMultipleVariants() + { + Fruit fruit = CreateFruit(); + fruit.Banana = new Banana { Count = 2 }; + var options = new JsonSerializerOptions(); + options.Converters.Add(new FruitJsonConverter()); + Assert.Throws(() => JsonSerializer.Serialize(fruit, options)); + } + + [Fact] + public void UsesGeneratedVariantConverterWhenNotRegistered() + { + Fruit fruit = CreateFruit(); + var options = new JsonSerializerOptions(); + options.Converters.Add(new FruitJsonConverter()); + using JsonDocument json = JsonDocument.Parse(JsonSerializer.Serialize(fruit, options)); + Assert.Equal("gala", json.RootElement.GetProperty("kind").GetString()); + } + + [Fact] + public void UsesCustomVariantConverter() + { + Fruit fruit = CreateFruit(); + var options = new JsonSerializerOptions(); + options.Converters.Add(new FruitJsonConverter()); + options.Converters.Add(new CustomAppleConverter()); + using JsonDocument json = JsonDocument.Parse(JsonSerializer.Serialize(fruit, options)); + Assert.Equal("custom", json.RootElement.GetProperty("kind").GetString()); + } + + [Fact] + public void UsesDerivedVariantConverter() + { + Fruit fruit = CreateFruit(); + fruit.Apple = new FancyApple(); + var options = new JsonSerializerOptions(); + options.Converters.Add(new FruitJsonConverter()); + options.Converters.Add(new FancyAppleConverter()); + using JsonDocument json = JsonDocument.Parse(JsonSerializer.Serialize(fruit, options)); + Assert.Equal("fancy", json.RootElement.GetProperty("extra").GetString()); + } + + private sealed class CustomAppleConverter : JsonConverter + { + public override Apple Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options) => throw new NotSupportedException(); + public override void Write(Utf8JsonWriter writer, Apple value, JsonSerializerOptions options) + { + writer.WriteStartObject(); writer.WriteString("kind", "custom"); writer.WriteEndObject(); + } + } + + private sealed class FancyApple : Apple { } + + private sealed class FancyAppleConverter : JsonConverter + { + public override FancyApple Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options) => throw new NotSupportedException(); + public override void Write(Utf8JsonWriter writer, FancyApple value, JsonSerializerOptions options) + { + writer.WriteStartObject(); writer.WriteString("extra", "fancy"); writer.WriteEndObject(); + } + } } } diff --git a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Model/Fruit.cs index 0baa3d46564f..4bca9576a162 100644 --- a/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net10/OneOf/src/Org.OpenAPITools/Model/Fruit.cs @@ -237,24 +237,71 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Orange != null) { - OrangeJsonConverter converter = (OrangeJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Orange))); - converter.WriteProperties(writer, fruit.Orange, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Orange; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new OrangeJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index 278ec341e5a4..a66ccc841790 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net10/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs index 1ab6928be39a..606bbcf0e7a5 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs @@ -207,18 +207,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs index 35343e52bd02..b362945b4468 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs @@ -181,18 +181,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 86177c4f6824..c34935f38ba0 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -254,12 +254,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs index a82cef00ef30..40dcc2d08de6 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs @@ -150,6 +150,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index bb23a0e706e9..c4063c3be37d 100644 --- a/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net10/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -232,6 +232,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/Fruit.cs index becd99ba38c4..1c250cd67e61 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Model/Fruit.cs index 828fdb6b8cb4..0a248b0cf693 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/OneOf/src/Org.OpenAPITools/Model/Fruit.cs @@ -235,24 +235,71 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Orange != null) { - OrangeJsonConverter converter = (OrangeJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Orange))); - converter.WriteProperties(writer, fruit.Orange, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Orange; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new OrangeJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index becd99ba38c4..1c250cd67e61 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net4.7/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs index becd99ba38c4..1c250cd67e61 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs index 828fdb6b8cb4..0a248b0cf693 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs @@ -235,24 +235,71 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Orange != null) { - OrangeJsonConverter converter = (OrangeJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Orange))); - converter.WriteProperties(writer, fruit.Orange, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Orange; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new OrangeJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index becd99ba38c4..1c250cd67e61 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net4.8/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs index 278ec341e5a4..a66ccc841790 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net8/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs index 3a8961d81398..da3ff8c39e18 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs @@ -206,18 +206,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs index ae8e0b25a148..9a06acffd3d1 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs @@ -180,18 +180,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 74488c4f2078..f7c8e2a305df 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -253,12 +253,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs index 29000bb7adad..38bb5a08d5b6 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs @@ -149,6 +149,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index c5c884525043..65bdbc127569 100644 --- a/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net8/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -231,6 +231,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs index 0baa3d46564f..4bca9576a162 100644 --- a/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net8/OneOf/src/Org.OpenAPITools/Model/Fruit.cs @@ -237,24 +237,71 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Orange != null) { - OrangeJsonConverter converter = (OrangeJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Orange))); - converter.WriteProperties(writer, fruit.Orange, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Orange; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new OrangeJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index 278ec341e5a4..a66ccc841790 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net8/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs index 1ab6928be39a..606bbcf0e7a5 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs @@ -207,18 +207,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs index 35343e52bd02..b362945b4468 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs @@ -181,18 +181,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 86177c4f6824..c34935f38ba0 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -254,12 +254,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs index a82cef00ef30..40dcc2d08de6 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs @@ -150,6 +150,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index bb23a0e706e9..c4063c3be37d 100644 --- a/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net8/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -232,6 +232,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/Fruit.cs index 278ec341e5a4..a66ccc841790 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net9/FormModels/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs index 3a8961d81398..da3ff8c39e18 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/Fruit.cs @@ -206,18 +206,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs index ae8e0b25a148..9a06acffd3d1 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/FruitReq.cs @@ -180,18 +180,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 74488c4f2078..f7c8e2a305df 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -253,12 +253,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs index 29000bb7adad..38bb5a08d5b6 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/OneOfString.cs @@ -149,6 +149,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index c5c884525043..65bdbc127569 100644 --- a/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net9/NullReferenceTypes/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -231,6 +231,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Model/Fruit.cs index 0baa3d46564f..4bca9576a162 100644 --- a/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net9/OneOf/src/Org.OpenAPITools/Model/Fruit.cs @@ -237,24 +237,71 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Orange != null) { - OrangeJsonConverter converter = (OrangeJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Orange))); - converter.WriteProperties(writer, fruit.Orange, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Orange; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new OrangeJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index 278ec341e5a4..a66ccc841790 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net9/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs index 1ab6928be39a..606bbcf0e7a5 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/Fruit.cs @@ -207,18 +207,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs index 35343e52bd02..b362945b4468 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/FruitReq.cs @@ -181,18 +181,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index 86177c4f6824..c34935f38ba0 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -254,12 +254,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs index a82cef00ef30..40dcc2d08de6 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/OneOfString.cs @@ -150,6 +150,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index bb23a0e706e9..c4063c3be37d 100644 --- a/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/net9/SourceGeneration/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -232,6 +232,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/Fruit.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/Fruit.cs index becd99ba38c4..1c250cd67e61 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/Fruit.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/Fruit.cs @@ -204,18 +204,50 @@ public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOpt { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruit.Apple != null) { - AppleJsonConverter converter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Apple))); - converter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Apple; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruit.Banana != null) { - BananaJsonConverter converter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(Banana))); - converter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for Fruit."); + oneOfValueWritten = true; + var variant = fruit.Banana; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruit, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs index 5fe1498b5d6e..ebcf06bc2bbb 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/FruitReq.cs @@ -178,18 +178,50 @@ public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSeriali { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (fruitReq.AppleReq != null) { - AppleReqJsonConverter converter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(AppleReq))); - converter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.AppleReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new AppleReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } if (fruitReq.BananaReq != null) { - BananaReqJsonConverter converter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(BananaReq))); - converter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for FruitReq."); + oneOfValueWritten = true; + var variant = fruitReq.BananaReq; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new BananaReqJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, fruitReq, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs index a28ca47d9ce3..03d79915715d 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/MixedOneOfContent.cs @@ -251,12 +251,29 @@ public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfCo { writer.WriteStartObject(); + bool oneOfValueWritten = false; if (mixedOneOfContent.MixedSubId != null) { - MixedSubIdJsonConverter converter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(typeof(MixedSubId))); - converter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions); + if (oneOfValueWritten) + throw new JsonException("Multiple oneOf variants are set for MixedOneOfContent."); + oneOfValueWritten = true; + var variant = mixedOneOfContent.MixedSubId; + var variantOptions = jsonSerializerOptions; + if (!jsonSerializerOptions.Converters.Any(c => c.CanConvert(variant.GetType()))) + { + variantOptions = new JsonSerializerOptions(jsonSerializerOptions); + variantOptions.Converters.Add(new MixedSubIdJsonConverter()); + } + using (JsonDocument document = JsonDocument.Parse(JsonSerializer.Serialize(variant, variant.GetType(), variantOptions))) + { + if (document.RootElement.ValueKind != JsonValueKind.Object) + throw new JsonException("The oneOf variant must serialize as an object."); + foreach (JsonProperty property in document.RootElement.EnumerateObject()) + property.WriteTo(writer); + } } + _ = oneOfValueWritten; WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs index f7348b0bcbca..0db724311b75 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/OneOfString.cs @@ -147,6 +147,8 @@ public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonS { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, oneOfString, jsonSerializerOptions); writer.WriteEndObject(); } diff --git a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs index affea08f6f8a..213650691ad3 100644 --- a/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs +++ b/samples/client/petstore/csharp/generichost/standard2.0/Petstore/src/Org.OpenAPITools/Model/PolymorphicProperty.cs @@ -229,6 +229,8 @@ public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphi { writer.WriteStartObject(); + bool oneOfValueWritten = false; + _ = oneOfValueWritten; WriteProperties(writer, polymorphicProperty, jsonSerializerOptions); writer.WriteEndObject(); }