From b416d7109a8b6faaa71fd2e9413723ab14db3bec Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Sat, 11 Oct 2025 22:44:27 -0700
Subject: [PATCH 1/2] Fix launcher not showing mods Convert `Version` and
`SptVersion` to strings when serializing JSON for AbstractModMetadata
---
.../Models/Spt/Mod/AbstractModMetadata.cs | 6 ++++-
.../Json/Converters/ToStringJsonConverter.cs | 24 +++++++++++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
create mode 100644 Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
diff --git a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs
index 17d0c4353..b711730e5 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Spt/Mod/AbstractModMetadata.cs
@@ -1,4 +1,6 @@
-using Range = SemanticVersioning.Range;
+using System.Text.Json.Serialization;
+using SPTarkov.Server.Core.Utils.Json.Converters;
+using Range = SemanticVersioning.Range;
using Version = SemanticVersioning.Version;
namespace SPTarkov.Server.Core.Models.Spt.Mod;
@@ -40,6 +42,7 @@ public abstract record AbstractModMetadata
///
/// Version = new Version("1.0.0.0"); is not
///
+ [JsonConverter(typeof(ToStringJsonConverter))]
public abstract Version Version { get; init; }
///
@@ -49,6 +52,7 @@ public abstract record AbstractModMetadata
///
/// Version = new Version("4.0.0.0"); is not
///
+ [JsonConverter(typeof(ToStringJsonConverter))]
public abstract Range SptVersion { get; init; }
///
diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
new file mode 100644
index 000000000..8e6c9454b
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
@@ -0,0 +1,24 @@
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Utils.Json.Converters;
+
+internal class ToStringJsonConverter : JsonConverter
+{
+ public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ throw new NotSupportedException($"Deserialization of {typeof(T).Name} from string is not supported.");
+ }
+
+ public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
+ {
+ if (value == null)
+ {
+ writer.WriteNullValue();
+ }
+ else
+ {
+ writer.WriteStringValue(value.ToString());
+ }
+ }
+}
From 1bdfd4186e193844d014201d3c67432a9828856b Mon Sep 17 00:00:00 2001
From: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com>
Date: Sat, 11 Oct 2025 22:55:44 -0700
Subject: [PATCH 2/2] Implement ToStringJsonConverter Read method
---
.../Json/Converters/ToStringJsonConverter.cs | 22 +++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
index 8e6c9454b..11069f084 100644
--- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
+++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/ToStringJsonConverter.cs
@@ -5,9 +5,27 @@ namespace SPTarkov.Server.Core.Utils.Json.Converters;
internal class ToStringJsonConverter : JsonConverter
{
- public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
- throw new NotSupportedException($"Deserialization of {typeof(T).Name} from string is not supported.");
+ if (reader.TokenType == JsonTokenType.Null)
+ {
+ return default;
+ }
+
+ if (reader.TokenType == JsonTokenType.String)
+ {
+ var value = reader.GetString();
+ try
+ {
+ return (T?)Activator.CreateInstance(typeToConvert, value);
+ }
+ catch (Exception ex)
+ {
+ throw new JsonException($"Unable to convert \"{value}\" to {typeof(T).Name}.", ex);
+ }
+ }
+
+ throw new JsonException($"Expected string to deserialize {typeof(T).Name} but got {reader.TokenType}.");
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)