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)