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