73 lines
No EOL
2.4 KiB
Text
73 lines
No EOL
2.4 KiB
Text
@using System.Text.Json
|
|
|
|
<div class="json">
|
|
@if (Element.ValueKind == JsonValueKind.Array)
|
|
{
|
|
@if (Element.GetArrayLength() == 0)
|
|
{
|
|
<span class="keyword">Empty</span>
|
|
}
|
|
else
|
|
{
|
|
var i = 0;
|
|
@foreach (var item in Element.EnumerateArray())
|
|
{
|
|
@switch (item.ValueKind)
|
|
{
|
|
case JsonValueKind.Array:
|
|
<dt>@i: []</dt>
|
|
break;
|
|
case JsonValueKind.Object:
|
|
<dt>@i: {}</dt>
|
|
break;
|
|
default:
|
|
<dt>@i:</dt>
|
|
break;
|
|
}
|
|
@RenderElement(item)
|
|
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
else if (Element.ValueKind == JsonValueKind.Object)
|
|
{
|
|
@foreach (var prop in Element.EnumerateObject())
|
|
{
|
|
@switch (prop.Value.ValueKind)
|
|
{
|
|
case JsonValueKind.Array:
|
|
<dt>@prop.Name: []</dt>
|
|
break;
|
|
case JsonValueKind.Object:
|
|
<dt>@prop.Name: {}</dt>
|
|
break;
|
|
default:
|
|
<dt>@prop.Name:</dt>
|
|
break;
|
|
}
|
|
@RenderElement(prop.Value)
|
|
}
|
|
}
|
|
</div>
|
|
|
|
@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 => (@<dd>
|
|
<span class="keyword">@element.ValueKind.ToString()</span></dd>),
|
|
JsonValueKind.Array or JsonValueKind.Object => (@<dd>
|
|
<JsonViewer Element="element"/>
|
|
</dd>),
|
|
JsonValueKind.Number => (@<dd><span class="number">@element.GetDouble()</span></dd>),
|
|
JsonValueKind.String => (element.GetString() is { } s && s.StartsWith("https://") && Uri.TryCreate(s, UriKind.Absolute, out var _)
|
|
? @<dd><a href="@s" target="_blank">@s</a></dd>
|
|
: @<dd><span class="string">"@element.GetString()?.ReplaceLineEndings("\\n")"</span></dd>),
|
|
_ => throw new ArgumentOutOfRangeException()
|
|
};
|
|
}
|
|
} |