New: Use System.Text.Json for Nancy and SignalR

Co-Authored-By: ta264 <ta264@users.noreply.github.com>
This commit is contained in:
Qstick
2021-02-23 21:18:48 +00:00
parent 428c9c034c
commit 596ba2dcbc
39 changed files with 370 additions and 81 deletions

View File

@@ -2,6 +2,7 @@ using System.Data;
using System.Text.Json;
using System.Text.Json.Serialization;
using Dapper;
using NzbDrone.Common.Serializer;
namespace NzbDrone.Core.Datastore.Converters
{
@@ -22,8 +23,8 @@ namespace NzbDrone.Core.Datastore.Converters
};
serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true));
serializerSettings.Converters.Add(new TimeSpanConverter());
serializerSettings.Converters.Add(new UtcConverter());
serializerSettings.Converters.Add(new STJTimeSpanConverter());
serializerSettings.Converters.Add(new STJUtcConverter());
serializerSettings.Converters.Add(new DictionaryStringObjectJsonConverter());
SerializerSettings = serializerSettings;

View File

@@ -1,19 +0,0 @@
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace NzbDrone.Core.Datastore.Converters
{
public class TimeSpanConverter : JsonConverter<TimeSpan>
{
public override TimeSpan Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return TimeSpan.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, TimeSpan value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}
}

View File

@@ -1,7 +1,5 @@
using System;
using System.Data;
using System.Text.Json;
using System.Text.Json.Serialization;
using Dapper;
namespace NzbDrone.Core.Datastore.Converters
@@ -18,17 +16,4 @@ namespace NzbDrone.Core.Datastore.Converters
return DateTime.SpecifyKind((DateTime)value, DateTimeKind.Utc);
}
}
public class UtcConverter : JsonConverter<DateTime>
{
public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return DateTime.Parse(reader.GetString());
}
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System;
using System.Text.Json.Serialization;
using NLog;
using NzbDrone.Common.Instrumentation;
@@ -15,6 +16,7 @@ namespace NzbDrone.Core.Datastore
/// Allows a field to be lazy loaded.
/// </summary>
/// <typeparam name="TChild"></typeparam>
[JsonConverter(typeof(LazyLoadedConverterFactory))]
public class LazyLoaded<TChild> : ILazyLoaded
{
protected TChild _value;
@@ -62,11 +64,6 @@ namespace NzbDrone.Core.Datastore
{
return MemberwiseClone();
}
public bool ShouldSerializeValue()
{
return IsLoaded;
}
}
/// <summary>

View File

@@ -0,0 +1,90 @@
using System;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace NzbDrone.Core.Datastore
{
public class LazyLoadedConverterFactory : JsonConverterFactory
{
public override bool CanConvert(Type typeToConvert)
{
if (!typeToConvert.IsGenericType)
{
return false;
}
return typeToConvert.GetGenericTypeDefinition() == typeof(LazyLoaded<>);
}
public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options)
{
var childType = type.GetGenericArguments()[0];
return (JsonConverter)Activator.CreateInstance(
typeof(LazyLoadedConverter<>).MakeGenericType(childType),
BindingFlags.Instance | BindingFlags.Public,
binder: null,
args: new object[] { options },
culture: null);
}
private class LazyLoadedConverter<TChild> : JsonConverter<LazyLoaded<TChild>>
{
private readonly JsonConverter<TChild> _childConverter;
private readonly Type _childType;
public LazyLoadedConverter(JsonSerializerOptions options)
{
// For performance, use the existing converter if available.
_childConverter = (JsonConverter<TChild>)options
.GetConverter(typeof(TChild));
// Cache the type.
_childType = typeof(TChild);
}
public override LazyLoaded<TChild> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
TChild value;
if (_childConverter != null)
{
reader.Read();
value = _childConverter.Read(ref reader, _childType, options);
}
else
{
value = JsonSerializer.Deserialize<TChild>(ref reader, options);
}
if (value != null)
{
return new LazyLoaded<TChild>(value);
}
else
{
return null;
}
}
public override void Write(Utf8JsonWriter writer, LazyLoaded<TChild> value, JsonSerializerOptions options)
{
if (value.IsLoaded)
{
if (_childConverter != null)
{
_childConverter.Write(writer, value.Value, options);
}
else
{
JsonSerializer.Serialize(writer, value.Value, options);
}
}
else
{
writer.WriteNullValue();
}
}
}
}
}

View File

@@ -1,7 +1,10 @@
using System;
using System.Text.Json.Serialization;
using NzbDrone.Common.Serializer;
namespace NzbDrone.Core.Messaging.Commands
{
[JsonConverter(typeof(PolymorphicWriteOnlyJsonConverter<Command>))]
public abstract class Command
{
private bool _sendUpdatesToClient;

View File

@@ -1,9 +1,10 @@
using System.Collections.Generic;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
using Dapper;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Reflection;
using NzbDrone.Common.Serializer;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Datastore.Converters;
using NzbDrone.Core.Messaging.Events;
@@ -29,8 +30,8 @@ namespace NzbDrone.Core.ThingiProvider
};
serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true));
serializerSettings.Converters.Add(new TimeSpanConverter());
serializerSettings.Converters.Add(new UtcConverter());
serializerSettings.Converters.Add(new STJTimeSpanConverter());
serializerSettings.Converters.Add(new STJUtcConverter());
serializerSettings.Converters.Add(new DictionaryStringObjectJsonConverter());
_serializerSettings = serializerSettings;