using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Serialization; using Core.Models; using Core.Models.Eft.Common.Tables; using Core.Models.Eft.Ws; using Core.Models.Enums; using Core.Models.Spt.Dialog; using Core.Utils.Json.Converters; using SptCommon.Annotations; namespace Core.Utils; [Injectable(InjectionType.Singleton)] public class JsonUtil { private static readonly JsonSerializerOptions jsonSerializerOptionsNoIndent = new() { WriteIndented = false, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, Converters = { new ListOrTConverterFactory(), new DictionaryOrListConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), new EftListEnumConverter(), new BaseInteractionRequestDataConverter() } }; private static readonly JsonSerializerOptions jsonSerializerOptionsIndented = new(jsonSerializerOptionsNoIndent) { WriteIndented = true }; /// /// Convert JSON into an object /// /// The type of the object to deserialize to /// The JSON string to deserialize /// Deserialized object or null public T? Deserialize(string? json) { return string.IsNullOrEmpty(json) ? default : JsonSerializer.Deserialize(json, jsonSerializerOptionsNoIndent); } /// /// Convert JSON into an object /// /// The JSON string to deserialize /// The type of the object to deserialize to /// public object? Deserialize(string? json, Type type) { return string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize(json, type, jsonSerializerOptionsNoIndent); } /// /// Convert an object into JSON /// /// Type of the object being serialised /// Object to serialise /// Should JSON be indented /// Serialised object as JSON, or null public string? Serialize(T? obj, bool indented = false) { return obj == null ? null : JsonSerializer.Serialize(obj, indented ? jsonSerializerOptionsIndented : jsonSerializerOptionsNoIndent); } /// /// Convert an object into JSON /// /// Object to serialise /// Type of object being serialsied /// Should JSON be indented /// public string? Serialize(object? obj, Type type, bool indented = false) { return obj == null ? null : JsonSerializer.Serialize(obj, type, indented ? jsonSerializerOptionsIndented : jsonSerializerOptionsNoIndent); } }