Skip to content

Instantly share code, notes, and snippets.

@Pzixel
Last active May 17, 2021 13:33
Show Gist options
  • Save Pzixel/4cdb8b8362fc7c4cefe1e74e06b286b6 to your computer and use it in GitHub Desktop.
Save Pzixel/4cdb8b8362fc7c4cefe1e74e06b286b6 to your computer and use it in GitHub Desktop.
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace X
{
public class CheckedStringEnumConverter : StringEnumConverter
{
public CheckedStringEnumConverter() : this (false)
{
}
public CheckedStringEnumConverter(bool serializeAsNumbers)
{
SerializeAsNumbers = serializeAsNumbers;
}
public bool SerializeAsNumbers { get; }
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
if (SerializeAsNumbers && value != null)
{
var underlyingValue = Convert.ChangeType(value, value.GetType().GetEnumUnderlyingType());
writer.WriteValue(underlyingValue);
}
else
{
base.WriteJson(writer, value, serializer);
}
}
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
var value = base.ReadJson(reader, objectType, existingValue, serializer);
if (value is null)
{
return null;
}
var underlyingValue = Convert.ChangeType(value, objectType.GetEnumUnderlyingType());
if (!Enum.IsDefined(objectType, underlyingValue))
{
throw new JsonSerializationException($"{underlyingValue} is not valid value of type {objectType.Name}");
}
return value;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment