in Libraries/src/Amazon.Lambda.RuntimeSupport/Helpers/Logging/JsonLogMessageFormatter.cs [213:308]
private void FormatJsonValue(Utf8JsonWriter writer, object value, string formatArguments, MessageProperty.Directive directive)
{
if(value == null)
{
writer.WriteNullValue();
}
else if (directive == MessageProperty.Directive.JsonSerialization)
{
try
{
writer.WriteRawValue(JsonSerializer.Serialize(value, _jsonSerializationOptions));
}
catch
{
// If running in an AOT environment where the code is trimmed it is possible the reflection based serialization might fail due to code being trimmed.
// In that case fallback to writing the ToString version of the object.
writer.WriteStringValue(value.ToString());
}
}
else if (!string.IsNullOrEmpty(formatArguments))
{
writer.WriteStringValue(MessageProperty.ApplyFormatArgument(value, formatArguments));
}
else
{
switch (value)
{
case bool boolValue:
writer.WriteBooleanValue(boolValue);
break;
case byte byteValue:
writer.WriteNumberValue(byteValue);
break;
case sbyte sbyteValue:
writer.WriteNumberValue(sbyteValue);
break;
case char charValue:
writer.WriteStringValue(MemoryMarshal.CreateSpan(ref charValue, 1));
break;
case decimal decimalValue:
writer.WriteNumberValue(decimalValue);
break;
case double doubleValue:
writer.WriteNumberValue(doubleValue);
break;
case float floatValue:
writer.WriteNumberValue(floatValue);
break;
case int intValue:
writer.WriteNumberValue(intValue);
break;
case uint uintValue:
writer.WriteNumberValue(uintValue);
break;
case long longValue:
writer.WriteNumberValue(longValue);
break;
case ulong ulongValue:
writer.WriteNumberValue(ulongValue);
break;
case short shortValue:
writer.WriteNumberValue(shortValue);
break;
case ushort ushortValue:
writer.WriteNumberValue(ushortValue);
break;
case null:
writer.WriteNullValue();
break;
case DateTime dateTimeValue:
writer.WriteStringValue(dateTimeValue.ToString(DateFormat, CultureInfo.InvariantCulture));
break;
case DateTimeOffset dateTimeOffsetValue:
writer.WriteStringValue(dateTimeOffsetValue.ToString(DateFormat, CultureInfo.InvariantCulture));
break;
case DateOnly dateOnly:
writer.WriteStringValue(dateOnly.ToString(DateOnlyFormat, CultureInfo.InvariantCulture));
break;
case TimeOnly timeOnly:
writer.WriteStringValue(timeOnly.ToString(TimeOnlyFormat, CultureInfo.InvariantCulture));
break;
case byte[] byteArrayValue:
writer.WriteStringValue(MessageProperty.FormatByteArray(byteArrayValue));
break;
case ReadOnlyMemory<byte> roByteArrayValue:
writer.WriteStringValue(MessageProperty.FormatByteArray(roByteArrayValue.Span));
break;
case Memory<byte> meByteArrayValue:
writer.WriteStringValue(MessageProperty.FormatByteArray(meByteArrayValue.Span));
break;
default:
writer.WriteStringValue(ToInvariantString(value));
break;
}
}
}