Skip to content
Open
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,25 @@
{{#lambda.trimLineBreaks}}
int currentDepth = utf8JsonReader.CurrentDepth;

{{#composedSchemas.oneOf}}
{{#-first}}
bool oneOfHasPrimitiveType = false;
{{/-first}}
{{#isPrimitiveType}}
oneOfHasPrimitiveType = true;
{{/isPrimitiveType}}
{{#-last}}

if (!oneOfHasPrimitiveType &&
utf8JsonReader.TokenType != JsonTokenType.StartObject &&
utf8JsonReader.TokenType != JsonTokenType.StartArray)
throw new JsonException();
{{/-last}}
{{/composedSchemas.oneOf}}
{{^composedSchemas.oneOf}}
if (utf8JsonReader.TokenType != JsonTokenType.StartObject && utf8JsonReader.TokenType != JsonTokenType.StartArray)
throw new JsonException();
{{/composedSchemas.oneOf}}

JsonTokenType startingTokenType = utf8JsonReader.TokenType;

Expand Down Expand Up @@ -113,24 +130,54 @@
{{{datatypeWithEnum}}}{{nrt?}}{{^nrt}}{{#vendorExtensions.x-is-value-type}}?{{/vendorExtensions.x-is-value-type}}{{/nrt}} {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} = default;
{{#-last}}

Utf8JsonReader utf8JsonReaderOneOf = utf8JsonReader;
while (utf8JsonReaderOneOf.Read())

if (oneOfHasPrimitiveType &&
startingTokenType != JsonTokenType.StartObject &&
startingTokenType != JsonTokenType.StartArray)
{
if (startingTokenType == JsonTokenType.StartObject && utf8JsonReaderOneOf.TokenType == JsonTokenType.EndObject && currentDepth == utf8JsonReaderOneOf.CurrentDepth)
break;
{{#oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
{{#isPrimitiveType}}
{{^isAnyType}}
{{^isFreeFormObject}}
{{^isContainer}}
Utf8JsonReader utf8JsonReader{{name}} = utf8JsonReader;
if (ClientUtils.TryDeserialize<{{{datatypeWithEnum}}}{{nrt?}}{{^nrt}}{{#vendorExtensions.x-is-value-type}}?{{/vendorExtensions.x-is-value-type}}{{/nrt}}>(ref utf8JsonReader{{name}}, jsonSerializerOptions, out {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}) &&
{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}} != null)
{
return new {{classname}}({{#lambda.joinWithComma}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}.Value{{/vendorExtensions.x-is-value-type}} {{#model.composedSchemas.anyOf}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#vendorExtensions.x-is-value-type}}{{^isNullable}}.Value{{/isNullable}}{{/vendorExtensions.x-is-value-type}} {{/model.composedSchemas.anyOf}}{{#allVars}}{{^isDiscriminator}}{{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}}{{#required}}ParsedValue{{/required}} {{/isDiscriminator}}{{/allVars}}{{/lambda.joinWithComma}});
}

if (startingTokenType == JsonTokenType.StartArray && utf8JsonReaderOneOf.TokenType == JsonTokenType.EndArray && currentDepth == utf8JsonReaderOneOf.CurrentDepth)
break;
{{/isContainer}}
{{/isFreeFormObject}}
{{/isAnyType}}
{{/isPrimitiveType}}
{{/vendorExtensions.x-duplicated-data-type}}
{{/oneOf}}

if (utf8JsonReaderOneOf.TokenType == JsonTokenType.PropertyName && currentDepth == utf8JsonReaderOneOf.CurrentDepth - 1)
throw new JsonException();
}
else
{
Utf8JsonReader utf8JsonReaderOneOf = utf8JsonReader;
while (utf8JsonReaderOneOf.Read())
{
{{#oneOf}}
Utf8JsonReader utf8JsonReader{{name}} = utf8JsonReader;
ClientUtils.TryDeserialize<{{{datatypeWithEnum}}}{{nrt?}}{{^nrt}}{{#vendorExtensions.x-is-value-type}}?{{/vendorExtensions.x-is-value-type}}{{/nrt}}>(ref utf8JsonReader{{name}}, jsonSerializerOptions, out {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}});
{{^-last}}
if (startingTokenType == JsonTokenType.StartObject && utf8JsonReaderOneOf.TokenType == JsonTokenType.EndObject && currentDepth == utf8JsonReaderOneOf.CurrentDepth)
break;

{{/-last}}
{{/oneOf}}
if (startingTokenType == JsonTokenType.StartArray && utf8JsonReaderOneOf.TokenType == JsonTokenType.EndArray && currentDepth == utf8JsonReaderOneOf.CurrentDepth)
break;

if (utf8JsonReaderOneOf.TokenType == JsonTokenType.PropertyName && currentDepth == utf8JsonReaderOneOf.CurrentDepth - 1)
{
{{#oneOf}}
Utf8JsonReader utf8JsonReader{{name}} = utf8JsonReader;
ClientUtils.TryDeserialize<{{{datatypeWithEnum}}}{{nrt?}}{{^nrt}}{{#vendorExtensions.x-is-value-type}}?{{/vendorExtensions.x-is-value-type}}{{/nrt}}>(ref utf8JsonReader{{name}}, jsonSerializerOptions, out {{#lambda.camelcase_sanitize_param}}{{name}}{{/lambda.camelcase_sanitize_param}});
{{^-last}}

{{/-last}}
{{/oneOf}}
}
}
}
{{/-last}}
Expand Down Expand Up @@ -376,7 +423,71 @@

{{/children}}
{{/discriminator}}
{{^model.discriminator}}
{{#composedSchemas}}

{{#oneOf}}
{{#-first}}
int oneOfCount = 0;
{{/-first}}
{{^vendorExtensions.x-duplicated-data-type}}
if ({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}} != null)
oneOfCount++;
{{/vendorExtensions.x-duplicated-data-type}}
{{#-last}}

if (oneOfCount > 1)
throw new JsonException("Only one oneOf value can be set.");

{{/-last}}
{{/oneOf}}

{{#oneOf}}
{{#isPrimitiveType}}
{{#isContainer}}
if ({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}} != null)
{
JsonSerializer.Serialize(writer, {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}, jsonSerializerOptions);
return;
}

{{/isContainer}}
{{^isContainer}}
{{^vendorExtensions.x-duplicated-data-type}}
if ({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}} != null)
{
JsonSerializer.Serialize(writer, {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}, jsonSerializerOptions);
return;
}

{{/vendorExtensions.x-duplicated-data-type}}
{{/isContainer}}
{{/isPrimitiveType}}
{{/oneOf}}
{{/composedSchemas}}
{{/model.discriminator}}
writer.WriteStartObject();
{{^model.discriminator}}
{{#composedSchemas}}
{{#oneOf}}
{{^vendorExtensions.x-duplicated-data-type}}
{{#isModel}}
{{^isContainer}}
if ({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}} != null)
{
{{baseType}}JsonConverter? {{#lambda.camelcase_sanitize_param}}{{baseType}}JsonConverter{{/lambda.camelcase_sanitize_param}} = jsonSerializerOptions.Converters.FirstOrDefault(c => c.CanConvert({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}.GetType())) as {{baseType}}JsonConverter;
if ({{#lambda.camelcase_sanitize_param}}{{baseType}}JsonConverter{{/lambda.camelcase_sanitize_param}} == null)
throw new NotSupportedException("No compatible {{baseType}}JsonConverter was found for type " + {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}.GetType().FullName + ".");

{{#lambda.camelcase_sanitize_param}}{{baseType}}JsonConverter{{/lambda.camelcase_sanitize_param}}.WriteProperties(writer, {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}, jsonSerializerOptions);
}

{{/isContainer}}
{{/isModel}}
{{/vendorExtensions.x-duplicated-data-type}}
{{/oneOf}}
{{/composedSchemas}}
{{/model.discriminator}}

{{#model.discriminator}}
{{#model.hasDiscriminatorWithNonEmptyMapping}}
Expand All @@ -396,7 +507,10 @@
{{/isPrimitiveType}}
{{^isPrimitiveType}}
{
{{baseType}}JsonConverter {{#lambda.camelcase_sanitize_param}}{{baseType}}JsonConverter{{/lambda.camelcase_sanitize_param}} = ({{baseType}}JsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}.GetType()));
{{baseType}}JsonConverter? {{#lambda.camelcase_sanitize_param}}{{baseType}}JsonConverter{{/lambda.camelcase_sanitize_param}} = jsonSerializerOptions.Converters.FirstOrDefault(c => c.CanConvert({{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}.GetType())) as {{baseType}}JsonConverter;
if ({{#lambda.camelcase_sanitize_param}}{{baseType}}JsonConverter{{/lambda.camelcase_sanitize_param}} == null)
throw new NotSupportedException("No compatible {{baseType}}JsonConverter was found for type " + {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}.GetType().FullName + ".");

{{#lambda.camelcase_sanitize_param}}{{baseType}}JsonConverter{{/lambda.camelcase_sanitize_param}}.WriteProperties(writer, {{#lambda.camelcase_sanitize_param}}{{classname}}{{/lambda.camelcase_sanitize_param}}.{{name}}, jsonSerializerOptions);
}
{{/isPrimitiveType}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,18 @@ public override OneOfNullableTest Read(ref Utf8JsonReader utf8JsonReader, Type t
/// <exception cref="NotImplementedException"></exception>
public override void Write(Utf8JsonWriter writer, OneOfNullableTest oneOfNullableTest, JsonSerializerOptions jsonSerializerOptions)
{
if (oneOfNullableTest.Int != null)
{
JsonSerializer.Serialize(writer, oneOfNullableTest.Int, jsonSerializerOptions);
return;
}

if (oneOfNullableTest.String != null)
{
JsonSerializer.Serialize(writer, oneOfNullableTest.String, jsonSerializerOptions);
return;
}

writer.WriteStartObject();

WriteProperties(writer, oneOfNullableTest, jsonSerializerOptions);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,18 @@ public override ParentWithPluralOneOfPropertyNumber Read(ref Utf8JsonReader utf8
/// <exception cref="NotImplementedException"></exception>
public override void Write(Utf8JsonWriter writer, ParentWithPluralOneOfPropertyNumber parentWithPluralOneOfPropertyNumber, JsonSerializerOptions jsonSerializerOptions)
{
if (parentWithPluralOneOfPropertyNumber.Number != null)
{
JsonSerializer.Serialize(writer, parentWithPluralOneOfPropertyNumber.Number, jsonSerializerOptions);
return;
}

if (parentWithPluralOneOfPropertyNumber.Number2 != null)
{
JsonSerializer.Serialize(writer, parentWithPluralOneOfPropertyNumber.Number2, jsonSerializerOptions);
return;
}

writer.WriteStartObject();

WriteProperties(writer, parentWithPluralOneOfPropertyNumber, jsonSerializerOptions);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,18 @@ public override OneOfArrayRequest Read(ref Utf8JsonReader utf8JsonReader, Type t
/// <exception cref="NotImplementedException"></exception>
public override void Write(Utf8JsonWriter writer, OneOfArrayRequest oneOfArrayRequest, JsonSerializerOptions jsonSerializerOptions)
{
if (oneOfArrayRequest.List != null)
{
JsonSerializer.Serialize(writer, oneOfArrayRequest.List, jsonSerializerOptions);
return;
}

if (oneOfArrayRequest.List1 != null)
{
JsonSerializer.Serialize(writer, oneOfArrayRequest.List1, jsonSerializerOptions);
return;
}

writer.WriteStartObject();

WriteProperties(writer, oneOfArrayRequest, jsonSerializerOptions);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,17 @@ public override Fruit Read(ref Utf8JsonReader utf8JsonReader, Type typeToConvert
public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOptions jsonSerializerOptions)
{
writer.WriteStartObject();
if (fruit.Apple != null)
{
AppleJsonConverter appleJsonConverter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(fruit.Apple.GetType()));
appleJsonConverter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions);
}

if (fruit.Banana != null)
{
BananaJsonConverter bananaJsonConverter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(fruit.Banana.GetType()));
bananaJsonConverter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions);
}

WriteProperties(writer, fruit, jsonSerializerOptions);
writer.WriteEndObject();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,17 @@ public override FruitReq Read(ref Utf8JsonReader utf8JsonReader, Type typeToConv
public override void Write(Utf8JsonWriter writer, FruitReq fruitReq, JsonSerializerOptions jsonSerializerOptions)
{
writer.WriteStartObject();
if (fruitReq.AppleReq != null)
{
AppleReqJsonConverter appleReqJsonConverter = (AppleReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(fruitReq.AppleReq.GetType()));
appleReqJsonConverter.WriteProperties(writer, fruitReq.AppleReq, jsonSerializerOptions);
}

if (fruitReq.BananaReq != null)
{
BananaReqJsonConverter bananaReqJsonConverter = (BananaReqJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(fruitReq.BananaReq.GetType()));
bananaReqJsonConverter.WriteProperties(writer, fruitReq.BananaReq, jsonSerializerOptions);
}

WriteProperties(writer, fruitReq, jsonSerializerOptions);
writer.WriteEndObject();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,36 @@ public override MixedOneOfContent Read(ref Utf8JsonReader utf8JsonReader, Type t
/// <exception cref="NotImplementedException"></exception>
public override void Write(Utf8JsonWriter writer, MixedOneOfContent mixedOneOfContent, JsonSerializerOptions jsonSerializerOptions)
{
if (mixedOneOfContent.String != null)
{
JsonSerializer.Serialize(writer, mixedOneOfContent.String, jsonSerializerOptions);
return;
}

if (mixedOneOfContent.Bool != null)
{
JsonSerializer.Serialize(writer, mixedOneOfContent.Bool, jsonSerializerOptions);
return;
}

if (mixedOneOfContent.Int != null)
{
JsonSerializer.Serialize(writer, mixedOneOfContent.Int, jsonSerializerOptions);
return;
}

if (mixedOneOfContent.Decimal != null)
{
JsonSerializer.Serialize(writer, mixedOneOfContent.Decimal, jsonSerializerOptions);
return;
}

writer.WriteStartObject();
if (mixedOneOfContent.MixedSubId != null)
{
MixedSubIdJsonConverter mixedSubIdJsonConverter = (MixedSubIdJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(mixedOneOfContent.MixedSubId.GetType()));
mixedSubIdJsonConverter.WriteProperties(writer, mixedOneOfContent.MixedSubId, jsonSerializerOptions);
}

WriteProperties(writer, mixedOneOfContent, jsonSerializerOptions);
writer.WriteEndObject();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,12 @@ public override OneOfString Read(ref Utf8JsonReader utf8JsonReader, Type typeToC
/// <exception cref="NotImplementedException"></exception>
public override void Write(Utf8JsonWriter writer, OneOfString oneOfString, JsonSerializerOptions jsonSerializerOptions)
{
if (oneOfString.String != null)
{
JsonSerializer.Serialize(writer, oneOfString.String, jsonSerializerOptions);
return;
}

writer.WriteStartObject();

WriteProperties(writer, oneOfString, jsonSerializerOptions);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,30 @@ public override PolymorphicProperty Read(ref Utf8JsonReader utf8JsonReader, Type
/// <exception cref="NotImplementedException"></exception>
public override void Write(Utf8JsonWriter writer, PolymorphicProperty polymorphicProperty, JsonSerializerOptions jsonSerializerOptions)
{
if (polymorphicProperty.Bool != null)
{
JsonSerializer.Serialize(writer, polymorphicProperty.Bool, jsonSerializerOptions);
return;
}

if (polymorphicProperty.String != null)
{
JsonSerializer.Serialize(writer, polymorphicProperty.String, jsonSerializerOptions);
return;
}

if (polymorphicProperty.Object != null)
{
JsonSerializer.Serialize(writer, polymorphicProperty.Object, jsonSerializerOptions);
return;
}

if (polymorphicProperty.List != null)
{
JsonSerializer.Serialize(writer, polymorphicProperty.List, jsonSerializerOptions);
return;
}

writer.WriteStartObject();

WriteProperties(writer, polymorphicProperty, jsonSerializerOptions);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,17 @@ public override Fruit Read(ref Utf8JsonReader utf8JsonReader, Type typeToConvert
public override void Write(Utf8JsonWriter writer, Fruit fruit, JsonSerializerOptions jsonSerializerOptions)
{
writer.WriteStartObject();
if (fruit.Apple != null)
{
AppleJsonConverter appleJsonConverter = (AppleJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(fruit.Apple.GetType()));
appleJsonConverter.WriteProperties(writer, fruit.Apple, jsonSerializerOptions);
}

if (fruit.Banana != null)
{
BananaJsonConverter bananaJsonConverter = (BananaJsonConverter) jsonSerializerOptions.Converters.First(c => c.CanConvert(fruit.Banana.GetType()));
bananaJsonConverter.WriteProperties(writer, fruit.Banana, jsonSerializerOptions);
}

WriteProperties(writer, fruit, jsonSerializerOptions);
writer.WriteEndObject();
Expand Down
Loading