using Newtonsoft.Json;
namespace Pilz.Json;
public class AppVersionStringJsonConverter(bool serializeAsObject) : JsonConverter
{
public AppVersionStringJsonConverter() : this(false)
{
}
///
/// Writes the JSON representation of the object.
///
/// The to write to.
/// The value.
/// The calling serializer.
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
{
if (value == null)
{
writer.WriteNull();
return;
}
if (serializeAsObject || value is not AppVersion appVersion)
writer.WriteValue(value);
else
writer.WriteValue(appVersion.ToString());
}
///
/// Reads the JSON representation of the object.
///
/// The to read from.
/// Type of the object.
/// The existing value of object being read.
/// The calling serializer.
/// The object value.
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
return null;
try
{
if (reader.TokenType == JsonToken.String)
{
var strValue = reader.Value?.ToString();
if (string.IsNullOrWhiteSpace(strValue))
return null;
return AppVersion.Parse(strValue);
}
if (reader.TokenType == JsonToken.StartObject)
return serializer.Deserialize(reader);
}
catch (Exception ex)
{
throw new JsonSerializationException("Error converting value {0} to type '{1}'.", ex);
}
// we don't actually expect to get here.
throw new JsonSerializationException("Unexpected token {0} when parsing app version.");
}
///
/// Determines whether this instance can convert the specified object type.
///
/// Type of the object.
///
/// true if this instance can convert the specified object type; otherwise, false.
///
public override bool CanConvert(Type objectType)
{
return objectType == typeof(AppVersion);
}
}