@using System.Text.Json
@if (Element.ValueKind == JsonValueKind.Array)
{
@if (Element.GetArrayLength() == 0)
{
Empty
}
else
{
var i = 0;
@foreach (var item in Element.EnumerateArray())
{
@switch (item.ValueKind)
{
case JsonValueKind.Array:
@i: []
break;
case JsonValueKind.Object:
@i: {}
break;
default:
@i:
break;
}
@RenderElement(item)
i++;
}
}
}
else if (Element.ValueKind == JsonValueKind.Object)
{
@foreach (var prop in Element.EnumerateObject())
{
@switch (prop.Value.ValueKind)
{
case JsonValueKind.Array:
@prop.Name: []
break;
case JsonValueKind.Object:
@prop.Name: {}
break;
default:
@prop.Name:
break;
}
@RenderElement(prop.Value)
}
}
@code {
[Parameter, EditorRequired] public required JsonElement Element { get; set; }
RenderFragment RenderElement(JsonElement element)
{
return element.ValueKind switch
{
JsonValueKind.True or JsonValueKind.False or JsonValueKind.Null or JsonValueKind.Undefined => (@
@element.ValueKind.ToString()),
JsonValueKind.Array or JsonValueKind.Object => (@
),
JsonValueKind.Number => (@@element.GetDouble()),
JsonValueKind.String => (element.GetString() is { } s && s.StartsWith("https://") && Uri.TryCreate(s, UriKind.Absolute, out var _)
? @@s
: @"@element.GetString()?.ReplaceLineEndings("\\n")"),
_ => throw new ArgumentOutOfRangeException()
};
}
}