Beispiel #1
0
        public virtual void Write(MetadataSerializer serializer, Utf8JsonWriter writer, object?value, IEnumerable <string> valuePath, RendererContext context)
        {
            if (value == null)
            {
                writer.WriteString("type", "null");
                return;
            }

            switch (value)
            {
            case sbyte:
            case byte:
            case short:
            case ushort:
            case int:
            case uint:
            case long:
            case ulong:
            case float:
            case double:
            case decimal:
                writer.WriteString("type", "number");
                writer.WriteString("extendedType", GetFullName(value.GetType()));
                return;

            case string:
                writer.WriteString("type", "string");
                return;

            case bool:
                writer.WriteString("type", "bool");
                return;

            case IEnumerable ie:
                writer.WriteString("type", "array");
                writer.WriteString("extendedType", GetFullName(value.GetType()));

                writer.WriteStartArray("children");

                foreach (var elem in ie)
                {
                    writer.WriteStartObject();
                    serializer.Serialize(writer, elem, valuePath, context);
                    writer.WriteEndObject();
                }

                writer.WriteEndArray();
                return;
            }

            var type = value.GetType();

            if (type.IsEnum)
            {
                var enumNames = type.GetEnumNames();

                writer.WriteString("type", $"enum");
                writer.WriteStartArray("values");

                foreach (var enumName in enumNames)
                {
                    writer.WriteStringValue(enumName);
                }

                writer.WriteEndArray();
                return;
            }

            writer.WriteString("type", "object");
            writer.WriteString("extendedType", GetFullName(value.GetType()));

            writer.WriteStartObject("children");
            foreach (var prop in type.GetProperties(BindingFlags.Instance | BindingFlags.Public))
            {
                writer.WriteStartObject(prop.Name);
                serializer.Serialize(writer, prop.GetValue(value), valuePath, context);
                writer.WriteEndObject();
            }
            writer.WriteEndObject();
        }
Beispiel #2
0
        public void Serialize(Utf8JsonWriter writer, object?value, IEnumerable <string> valuePath, RendererContext context)
        {
            try
            {
                var converter = GetConverter(value?.GetType() ?? typeof(object));

                converter.Write(this, writer, value, valuePath, context);
            }
            catch (Exception e)
            {
                throw new Exception($"Failed to serialize at path {MetadataConverter.GetFullPath(valuePath)}", e);
            }
        }