asentrafin/backend/Services/Plaid/PlaidJson.cs

76 lines
2.5 KiB
C#

using System.Globalization;
using System.Text.Json;
namespace Asentrafin.Api.Services.Plaid;
internal static class PlaidJson
{
public static JsonElement? Property(this JsonElement element, string name)
{
return element.ValueKind == JsonValueKind.Object && element.TryGetProperty(name, out var value)
? value
: null;
}
public static string? String(this JsonElement element, string name)
{
var value = element.Property(name);
return value is { ValueKind: JsonValueKind.String } ? value.Value.GetString() : null;
}
public static decimal? Decimal(this JsonElement element, string name)
{
var value = element.Property(name);
return value is { ValueKind: JsonValueKind.Number } && value.Value.TryGetDecimal(out var parsed)
? parsed
: null;
}
public static int? Int(this JsonElement element, string name)
{
var value = element.Property(name);
return value is { ValueKind: JsonValueKind.Number } && value.Value.TryGetInt32(out var parsed)
? parsed
: null;
}
public static bool Bool(this JsonElement element, string name)
{
var value = element.Property(name);
return value is { ValueKind: JsonValueKind.True } ||
value is { ValueKind: JsonValueKind.False } && value.Value.GetBoolean();
}
public static DateOnly? Date(this JsonElement element, string name)
{
var value = element.String(name);
return DateOnly.TryParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsed)
? parsed
: null;
}
public static DateTimeOffset? DateTimeOffset(this JsonElement element, string name)
{
var value = element.String(name);
return System.DateTimeOffset.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var parsed)
? parsed
: null;
}
public static string[] StringArray(this JsonElement element, string name)
{
var value = element.Property(name);
if (value is not { ValueKind: JsonValueKind.Array })
{
return [];
}
return value.Value.EnumerateArray()
.Where(item => item.ValueKind == JsonValueKind.String)
.Select(item => item.GetString())
.Where(item => !string.IsNullOrWhiteSpace(item))
.Select(item => item!)
.ToArray();
}
}