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); } }