private void FormatJsonValue()

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;
                }
            }
        }