Lidarr/src/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs

54 lines
1.9 KiB
C#
Raw Normal View History

2020-08-18 20:11:44 +00:00
using System.Data;
using System.Text.Json;
using System.Text.Json.Serialization;
using Dapper;
namespace NzbDrone.Core.Datastore.Converters
{
2020-08-18 20:11:44 +00:00
public class EmbeddedDocumentConverter<T> : SqlMapper.TypeHandler<T>
{
2020-08-18 20:11:44 +00:00
protected readonly JsonSerializerOptions SerializerSettings;
2020-08-18 20:11:44 +00:00
public EmbeddedDocumentConverter()
{
2020-08-18 20:11:44 +00:00
var serializerSettings = new JsonSerializerOptions
{
2020-08-18 20:11:44 +00:00
AllowTrailingCommas = true,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault,
2020-08-18 20:11:44 +00:00
PropertyNameCaseInsensitive = true,
DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
2020-08-18 20:11:44 +00:00
serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true));
serializerSettings.Converters.Add(new KeyValuePairConverter()); /* Remove in .NET 5 */
2020-08-18 20:11:44 +00:00
serializerSettings.Converters.Add(new TimeSpanConverter());
serializerSettings.Converters.Add(new UtcConverter());
2020-08-18 20:11:44 +00:00
SerializerSettings = serializerSettings;
}
2020-08-18 20:11:44 +00:00
public EmbeddedDocumentConverter(params JsonConverter[] converters)
: this()
{
2020-08-18 20:11:44 +00:00
foreach (var converter in converters)
{
2020-08-18 20:11:44 +00:00
SerializerSettings.Converters.Add(converter);
}
}
2020-08-18 20:11:44 +00:00
public override void SetValue(IDbDataParameter parameter, T value)
{
2020-08-18 20:11:44 +00:00
// Cast to object to get all properties written out
// https://github.com/dotnet/corefx/issues/38650
parameter.Value = JsonSerializer.Serialize((object)value, SerializerSettings);
}
2020-08-18 20:11:44 +00:00
public override T Parse(object value)
{
2020-08-18 20:11:44 +00:00
return JsonSerializer.Deserialize<T>((string)value, SerializerSettings);
}
}
}