in src/AutoRest.CSharp/Common/Output/Builders/JsonSerializationMethodsBuilder.cs [471:574]
private static MethodBodyStatement SerializeFrameworkTypeValue(Utf8JsonWriterExpression utf8JsonWriter, JsonValueSerialization valueSerialization, ValueExpression value, Type valueType, ModelReaderWriterOptionsExpression? options)
{
if (valueType == typeof(JsonElement))
{
return new JsonElementExpression(value).WriteTo(utf8JsonWriter);
}
if (valueType == typeof(Nullable<>))
{
valueType = valueSerialization.Type.Arguments[0].FrameworkType;
}
value = value.NullableStructValue(valueSerialization.Type);
if (valueType == typeof(decimal) ||
valueType == typeof(double) ||
valueType == typeof(float) ||
IsIntType(valueType))
{
if (valueSerialization.Format is SerializationFormat.Int_String &&
IsIntType(valueType))
{
return utf8JsonWriter.WriteStringValue(value.InvokeToString());
}
return utf8JsonWriter.WriteNumberValue(value);
}
if (valueType == typeof(object))
{
return utf8JsonWriter.WriteObjectValue(new TypedValueExpression(valueType, value), options);
}
// These are string-like types that could implicitly convert to string type
if (valueType == typeof(string) || valueType == typeof(char) || valueType == typeof(Guid) || valueType == typeof(ResourceIdentifier) || valueType == typeof(ResourceType) || valueType == typeof(AzureLocation))
{
return utf8JsonWriter.WriteStringValue(value);
}
if (valueType == typeof(bool))
{
return utf8JsonWriter.WriteBooleanValue(value);
}
if (valueType == typeof(byte[]))
{
return utf8JsonWriter.WriteBase64StringValue(value, valueSerialization.Format.ToFormatSpecifier());
}
if (valueType == typeof(DateTimeOffset) || valueType == typeof(DateTime) || valueType == typeof(TimeSpan))
{
var format = valueSerialization.Format.ToFormatSpecifier();
if (valueSerialization.Format is SerializationFormat.Duration_Seconds)
{
return utf8JsonWriter.WriteNumberValue(InvokeConvert.ToInt32(new TimeSpanExpression(value).InvokeToString(format)));
}
if (valueSerialization.Format is SerializationFormat.Duration_Seconds_Float or SerializationFormat.Duration_Seconds_Double)
{
return utf8JsonWriter.WriteNumberValue(InvokeConvert.ToDouble(new TimeSpanExpression(value).InvokeToString(format)));
}
if (valueSerialization.Format is SerializationFormat.DateTime_Unix)
{
return utf8JsonWriter.WriteNumberValue(value, format);
}
return format is not null
? utf8JsonWriter.WriteStringValue(value, format)
: utf8JsonWriter.WriteStringValue(value);
}
// These are string-like types that cannot implicitly convert to string type, therefore we need to call ToString on them
if (valueType == typeof(ETag) || valueType == typeof(ContentType) || valueType == typeof(IPAddress) || valueType == typeof(RequestMethod) || valueType == typeof(ExtendedLocationType))
{
return utf8JsonWriter.WriteStringValue(value.InvokeToString());
}
if (valueType == typeof(Uri))
{
return utf8JsonWriter.WriteStringValue(new MemberExpression(value, nameof(Uri.AbsoluteUri)));
}
if (valueType == typeof(BinaryData))
{
var binaryDataValue = new BinaryDataExpression(value);
if (valueSerialization.Format is SerializationFormat.Bytes_Base64 or SerializationFormat.Bytes_Base64Url)
{
return utf8JsonWriter.WriteBase64StringValue(new BinaryDataExpression(value).ToArray(), valueSerialization.Format.ToFormatSpecifier());
}
return utf8JsonWriter.WriteBinaryData(binaryDataValue);
}
if (valueType == typeof(Stream))
{
return utf8JsonWriter.WriteBinaryData(BinaryDataExpression.FromStream(value, false));
}
if (IsCustomJsonConverterAdded(valueType))
{
return JsonSerializerExpression.Serialize(utf8JsonWriter, value).ToStatement();
}
throw new NotSupportedException($"Framework type {valueType} serialization not supported, please add `CodeGenMemberSerializationHooks` to specify the serialization of this type with the customized property");
}