This ought to be helpful, might remove the reliance on JsonNode deserialization:
public record DateTimeOffsetOrBool
{
private readonly bool? _boolValue;
private readonly DateTimeOffset? _dateTimeOffsetValue;
public DateTimeOffsetOrBool( bool value )
{
_boolValue = value;
}
public DateTimeOffsetOrBool( DateTimeOffset value )
{
_dateTimeOffsetValue = value;
}
public bool IsBool => _boolValue.HasValue;
public bool IsDateTimeOffset => _dateTimeOffsetValue.HasValue;
public bool TryGetBool( out bool value )
{
if ( _boolValue.HasValue )
{
value = _boolValue.Value;
return true;
}
value = default;
return false;
}
public bool TryGetDateTimeOffset( out DateTimeOffset value )
{
if ( _dateTimeOffsetValue.HasValue )
{
value = _dateTimeOffsetValue.Value;
return true;
}
value = default;
return false;
}
public override string ToString()
{
if ( _boolValue.HasValue ) return _boolValue.Value.ToString();
if ( _dateTimeOffsetValue.HasValue ) return _dateTimeOffsetValue.Value.ToString();
return string.Empty;
}
public static implicit operator DateTimeOffsetOrBool( bool value )
=> new DateTimeOffsetOrBool( value );
public static implicit operator DateTimeOffsetOrBool( DateTimeOffset value )
=> new DateTimeOffsetOrBool( value );
}
public class UnixTimestampOrBoolJsonConverter : JsonConverter<DateTimeOffsetOrBool>
{
public override DateTimeOffsetOrBool? Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options )
{
switch ( reader.TokenType )
{
case JsonTokenType.Number:
return DateTimeOffset.FromUnixTimeSeconds( reader.GetInt64() );
case JsonTokenType.True:
return true;
case JsonTokenType.False:
return false;
default:
return null;
}
}
public override void Write( Utf8JsonWriter writer, DateTimeOffsetOrBool value, JsonSerializerOptions options )
{
if ( value.TryGetBool( out var boolValue ) )
{
writer.WriteBooleanValue( boolValue );
}
if ( value.TryGetDateTimeOffset( out var dateTimeOffsetValue ) )
{
writer.WriteNumberValue( dateTimeOffsetValue.ToUnixTimeSeconds() );
}
}
}
This ought to be helpful, might remove the reliance on
JsonNode
deserialization:Credit: Sir Rufo from C# Discord server