Skip to content

Instantly share code, notes, and snippets.

@timheuer
Last active August 17, 2023 04:57
Show Gist options
  • Save timheuer/e5fb1d18b6bc97c50bbe85b5ed0aff6e to your computer and use it in GitHub Desktop.
Save timheuer/e5fb1d18b6bc97c50bbe85b5ed0aff6e to your computer and use it in GitHub Desktop.
JsonConverters
namespace TempStick;
public class BooleanConverter : JsonConverter<bool>
{
public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
return string.Equals(reader.GetString(), "1", StringComparison.OrdinalIgnoreCase);
}
return reader.TryGetInt32(out var value) && value == 1;
}
public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
{
// NOTE: This assumes that a string 1/0 will work. TempStick API sometimes has defaults as int but then when changed they suddenly are strings
writer.WriteStringValue(value ? "1" : "0");
}
}
public class DayOfWeekConverter : JsonConverter<DayOfWeek>
{
public override DayOfWeek Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var valueAsString = reader.GetString();
if (int.TryParse(valueAsString, out int value))
{
return (DayOfWeek)(value - 1);
}
throw new JsonException($"Invalid value '{valueAsString}' for {nameof(DayOfWeek)}.");
}
public override void Write(Utf8JsonWriter writer, DayOfWeek value, JsonSerializerOptions options)
{
writer.WriteStringValue(((int)value + 1).ToString());
}
}

Having this pattern allows the response that will likely be something like:

{
  "use_timezone_offset":"1",
  "is_subuser": 0
  "weekday_for_reports": "3"
}

To be better serialized so a client could use:

apiResponse.UseTimeZoneOffset = true;
apiResponse.IsSubuser = false;
apiResponse.WeekdayForReports = DayOfWeek.Tuesday;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment