From d9b6062767b31ce5bfa362a30ad696419d1afc3b Mon Sep 17 00:00:00 2001 From: glax Date: Wed, 31 May 2023 21:43:07 +0200 Subject: [PATCH] Custom JSON Deserializer for concrete classes of abstract class TrangaTask --- Tranga/TaskManager.cs | 2 +- Tranga/TrangaTask.cs | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Tranga/TaskManager.cs b/Tranga/TaskManager.cs index 81e7ada..bbdc0eb 100644 --- a/Tranga/TaskManager.cs +++ b/Tranga/TaskManager.cs @@ -307,7 +307,7 @@ public class TaskManager { logger?.WriteLine(this.GetType().ToString(), $"Importing tasks from {settings.tasksFilePath}"); buffer = File.ReadAllText(settings.tasksFilePath); - this._allTasks = JsonConvert.DeserializeObject>(buffer)!; + this._allTasks = JsonConvert.DeserializeObject>(buffer, new JsonSerializerSettings() { Converters = { new TrangaTask.TrangaTaskJsonConverter() } })!; } if (File.Exists(settings.knownPublicationsPath)) diff --git a/Tranga/TrangaTask.cs b/Tranga/TrangaTask.cs index c8a6287..4cb2206 100644 --- a/Tranga/TrangaTask.cs +++ b/Tranga/TrangaTask.cs @@ -1,4 +1,6 @@ using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Tranga.TrangaTasks; namespace Tranga; @@ -56,4 +58,31 @@ public abstract class TrangaTask { return $"{task}, {lastExecuted}, {reoccurrence}, {state} {(connectorName is not null ? $", {connectorName}" : "" )} {(publication is not null ? $", {publication?.sortName}": "")}"; } + + public class TrangaTaskJsonConverter : JsonConverter + { + public override bool CanConvert(Type objectType) + { + return (objectType == typeof(TrangaTask)); + } + + public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) + { + JObject jo = JObject.Load(reader); + if (jo["task"]!.Value() == (Int64)Task.DownloadNewChapters) + return jo.ToObject(serializer)!; + + if (jo["task"]!.Value() == (Int64)Task.UpdateKomgaLibrary) + return jo.ToObject(serializer)!; + + throw new Exception(); + } + + public override bool CanWrite => false; + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + throw new Exception("Dont call this"); + } + } } \ No newline at end of file