From 713e0059752e13e05e230e0a6dc6a5cfa1dc231b Mon Sep 17 00:00:00 2001 From: Sardelka9515 Date: Sun, 19 Mar 2023 15:13:24 +0800 Subject: [PATCH] Ditch Newtonsoft.Json in favor of System.Text.Json --- Client/Scripting/ClientFile.cs | 6 +-- Client/Scripting/ClientResource.cs | 12 +++--- Client/Scripts/Menus/Sub/DevToolMenu.cs | 1 - Client/Scripts/Menus/Sub/ServersMenu.cs | 1 - Client/Scripts/PlayerList.cs | 2 +- Client/Scripts/RageCoop.Client.csproj | 1 - Client/Scripts/Scripting/API.Remoting.cs | 3 +- Client/Scripts/Scripting/API.cs | 1 - Client/Scripts/Util/Util.cs | 1 - Client/Scripts/Util/WeaponUtil.cs | 1 - Core/CoreUtils.cs | 6 +-- Core/JsonCoverters.cs | 52 +++++++++++------------- Core/RageCoop.Core.csproj | 1 - Core/Scripting/CustomEventHandler.cs | 8 ++-- Core/Scripting/ResourceFile.cs | 8 ++-- Core/Shared.cs | 12 +++--- Core/VehicleWeaponInfo.cs | 2 - Server/Networking/Server.Background.cs | 1 - Server/Program.cs | 1 + Server/RageCoop.Server.csproj | 1 - Tools/DataDumper/DataDumper.csproj | 4 -- Tools/DataDumper/Program.cs | 7 ++-- 22 files changed, 56 insertions(+), 76 deletions(-) diff --git a/Client/Scripting/ClientFile.cs b/Client/Scripting/ClientFile.cs index 17f7c24..034ed60 100644 --- a/Client/Scripting/ClientFile.cs +++ b/Client/Scripting/ClientFile.cs @@ -1,9 +1,9 @@ -using Newtonsoft.Json; -using RageCoop.Core.Scripting; +using RageCoop.Core.Scripting; using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.Json.Serialization; using System.Threading.Tasks; namespace RageCoop.Client.Scripting @@ -14,7 +14,7 @@ namespace RageCoop.Client.Scripting GetStream = GetStreamMethod; } - [JsonProperty] + [JsonInclude] public string FullPath { get; internal set; } Stream GetStreamMethod() { diff --git a/Client/Scripting/ClientResource.cs b/Client/Scripting/ClientResource.cs index 04ae22c..85d7c18 100644 --- a/Client/Scripting/ClientResource.cs +++ b/Client/Scripting/ClientResource.cs @@ -1,11 +1,11 @@ -using Newtonsoft.Json; -using RageCoop.Core.Scripting; +using RageCoop.Core.Scripting; using SHVDN; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; +using System.Text.Json.Serialization; using System.Threading.Tasks; namespace RageCoop.Client.Scripting @@ -17,25 +17,25 @@ namespace RageCoop.Client.Scripting /// /// Name of the resource /// - [JsonProperty] + [JsonInclude] public string Name { get; internal set; } /// /// Directory where the scripts is loaded from /// - [JsonProperty] + [JsonInclude] public string ScriptsDirectory { get; internal set; } /// /// A resource-specific folder that can be used to store your files. /// - [JsonProperty] + [JsonInclude] public string DataFolder { get; internal set; } /// /// Get the where this script is loaded from. /// - [JsonProperty] + [JsonInclude] public Dictionary Files { get; internal set; } = new Dictionary(); /// diff --git a/Client/Scripts/Menus/Sub/DevToolMenu.cs b/Client/Scripts/Menus/Sub/DevToolMenu.cs index 40cd351..6580f36 100644 --- a/Client/Scripts/Menus/Sub/DevToolMenu.cs +++ b/Client/Scripts/Menus/Sub/DevToolMenu.cs @@ -5,7 +5,6 @@ using GTA; using GTA.Native; using GTA.UI; using LemonUI.Menus; -using Newtonsoft.Json; using RageCoop.Core; diff --git a/Client/Scripts/Menus/Sub/ServersMenu.cs b/Client/Scripts/Menus/Sub/ServersMenu.cs index 021e6f3..a11989e 100644 --- a/Client/Scripts/Menus/Sub/ServersMenu.cs +++ b/Client/Scripts/Menus/Sub/ServersMenu.cs @@ -7,7 +7,6 @@ using System.Net.Http; using System.Threading; using GTA.UI; using LemonUI.Menus; -using Newtonsoft.Json; using RageCoop.Client.Scripting; using RageCoop.Core; diff --git a/Client/Scripts/PlayerList.cs b/Client/Scripts/PlayerList.cs index 9382b3a..3668791 100644 --- a/Client/Scripts/PlayerList.cs +++ b/Client/Scripts/PlayerList.cs @@ -1,11 +1,11 @@ using System.Collections.Generic; using System.Linq; using System.Net; +using System.Text.Json.Serialization; using GTA; using GTA.Math; using GTA.Native; using Lidgren.Network; -using Newtonsoft.Json; using RageCoop.Client.Menus; using RageCoop.Client.Scripting; using RageCoop.Core; diff --git a/Client/Scripts/RageCoop.Client.csproj b/Client/Scripts/RageCoop.Client.csproj index 0f0589f..f6d4681 100644 --- a/Client/Scripts/RageCoop.Client.csproj +++ b/Client/Scripts/RageCoop.Client.csproj @@ -37,7 +37,6 @@ - diff --git a/Client/Scripts/Scripting/API.Remoting.cs b/Client/Scripts/Scripting/API.Remoting.cs index fc1844b..4a03272 100644 --- a/Client/Scripts/Scripting/API.Remoting.cs +++ b/Client/Scripts/Scripting/API.Remoting.cs @@ -1,5 +1,4 @@ -using Newtonsoft.Json; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Reflection; diff --git a/Client/Scripts/Scripting/API.cs b/Client/Scripts/Scripting/API.cs index 84a1dae..cedc820 100644 --- a/Client/Scripts/Scripting/API.cs +++ b/Client/Scripts/Scripting/API.cs @@ -1,6 +1,5 @@ #undef DEBUG using Lidgren.Network; -using Newtonsoft.Json; using RageCoop.Client.Menus; using RageCoop.Core; using RageCoop.Core.Scripting; diff --git a/Client/Scripts/Util/Util.cs b/Client/Scripts/Util/Util.cs index dba83a4..6eba97c 100644 --- a/Client/Scripts/Util/Util.cs +++ b/Client/Scripts/Util/Util.cs @@ -8,7 +8,6 @@ using GTA.Math; using GTA.Native; using GTA.UI; using LemonUI.Elements; -using Newtonsoft.Json; using RageCoop.Core; using static RageCoop.Client.Shared; using Font = GTA.UI.Font; diff --git a/Client/Scripts/Util/WeaponUtil.cs b/Client/Scripts/Util/WeaponUtil.cs index 2091d76..aed3d6c 100644 --- a/Client/Scripts/Util/WeaponUtil.cs +++ b/Client/Scripts/Util/WeaponUtil.cs @@ -3,7 +3,6 @@ using System.IO; using GTA; using GTA.Math; using GTA.Native; -using Newtonsoft.Json; using RageCoop.Client.Scripting; using RageCoop.Core; diff --git a/Core/CoreUtils.cs b/Core/CoreUtils.cs index 452f407..5738d04 100644 --- a/Core/CoreUtils.cs +++ b/Core/CoreUtils.cs @@ -12,11 +12,11 @@ using System.Runtime.InteropServices; using System.Runtime.Loader; using System.Security.Cryptography; using System.Text; +using System.Text.Json.Serialization; using System.Xml; using GTA; using GTA.Math; using Lidgren.Network; -using Newtonsoft.Json; using RageCoop.Core.Scripting; [assembly: InternalsVisibleTo("RageCoop.Server")] @@ -390,9 +390,9 @@ namespace RageCoop.Core internal class IpInfo { - [JsonProperty("ip")] public string Address { get; set; } + [JsonPropertyName("ip")] public string Address { get; set; } - [JsonProperty("country")] public string Country { get; set; } + [JsonPropertyName("country")] public string Country { get; set; } } internal static class Extensions diff --git a/Core/JsonCoverters.cs b/Core/JsonCoverters.cs index 17a701d..e81495c 100644 --- a/Core/JsonCoverters.cs +++ b/Core/JsonCoverters.cs @@ -1,58 +1,54 @@ -using Newtonsoft.Json.Linq; -using Newtonsoft.Json; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Text.Json.Serialization; using System.Threading.Tasks; namespace RageCoop.Core { - class IPAddressConverter : JsonConverter + class IPAddressConverter : JsonConverter { public override bool CanConvert(Type objectType) { - return (objectType == typeof(IPAddress)); + return objectType == typeof(IPAddress); } - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override IPAddress Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - writer.WriteValue(value.ToString()); + if (reader.TokenType == JsonTokenType.Null) return null; + return IPAddress.Parse(reader.GetString()); } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + public override void Write(Utf8JsonWriter writer, IPAddress value, JsonSerializerOptions options) { - if (reader.TokenType == JsonToken.Null) return null; - return IPAddress.Parse((string)reader.Value); + writer.WriteStringValue(value?.ToString()); } } - class IPEndPointConverter : JsonConverter + class IPEndPointConverter : JsonConverter { public override bool CanConvert(Type objectType) { - return (objectType == typeof(IPEndPoint)); + return objectType == typeof(IPEndPoint); + } + public override IPEndPoint Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Null) return null; + var jo = JsonNode.Parse(ref reader); + return new IPEndPoint(IPAddress.Parse(jo["Address"].ToString()), int.Parse(jo["Port"].ToString())); } - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override void Write(Utf8JsonWriter writer, IPEndPoint value, JsonSerializerOptions options) { - IPEndPoint ep = (IPEndPoint)value; - JObject jo = new() + new JsonObject() { - { "Address", JToken.FromObject(ep.Address, serializer) }, - { "Port", ep.Port } - }; - jo.WriteTo(writer); - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - if (reader.TokenType == JsonToken.Null) return null; - JObject jo = JObject.Load(reader); - IPAddress address = jo["Address"].ToObject(serializer); - int port = (int)jo["Port"]; - return new IPEndPoint(address, port); + { "Address", value.Address?.ToString() }, + { "Port", value.Port } + }.WriteTo(writer); } } diff --git a/Core/RageCoop.Core.csproj b/Core/RageCoop.Core.csproj index 9003359..31f71b7 100644 --- a/Core/RageCoop.Core.csproj +++ b/Core/RageCoop.Core.csproj @@ -19,7 +19,6 @@ - diff --git a/Core/Scripting/CustomEventHandler.cs b/Core/Scripting/CustomEventHandler.cs index 4d3c19e..1ede59c 100644 --- a/Core/Scripting/CustomEventHandler.cs +++ b/Core/Scripting/CustomEventHandler.cs @@ -1,5 +1,5 @@ -using Newtonsoft.Json; -using System.Runtime.InteropServices; +using System.Runtime.InteropServices; +using System.Text.Json.Serialization; namespace RageCoop.Core.Scripting { @@ -44,10 +44,10 @@ namespace RageCoop.Core.Scripting [JsonIgnore] private CustomEventHandlerDelegate _managedHandler; // Used to keep GC reference - [JsonProperty] + [JsonInclude] public ulong FunctionPtr { get; private set; } - [JsonProperty] + [JsonInclude] public string Directory { get; private set; } /// diff --git a/Core/Scripting/ResourceFile.cs b/Core/Scripting/ResourceFile.cs index 7d936eb..a3e8d26 100644 --- a/Core/Scripting/ResourceFile.cs +++ b/Core/Scripting/ResourceFile.cs @@ -1,6 +1,6 @@ -using Newtonsoft.Json; -using System; +using System; using System.IO; +using System.Text.Json.Serialization; namespace RageCoop.Core.Scripting { @@ -11,13 +11,13 @@ namespace RageCoop.Core.Scripting /// /// Full name with relative path of this file /// - [JsonProperty] + [JsonInclude] public string Name { get; internal set; } /// /// Whether this is a directory /// - [JsonProperty] + [JsonInclude] public bool IsDirectory { get; internal set; } /// diff --git a/Core/Shared.cs b/Core/Shared.cs index aaf7544..c0e46d6 100644 --- a/Core/Shared.cs +++ b/Core/Shared.cs @@ -1,8 +1,7 @@ global using static RageCoop.Core.Shared; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; using System; using System.Reflection; +using System.Text.Json; namespace RageCoop.Core { @@ -24,22 +23,23 @@ namespace RageCoop.Core JsonTypeCheck(obj?.GetType()); return obj; } - public static readonly JsonSerializerSettings JsonSettings = new(); + public static readonly JsonSerializerOptions JsonSettings = new(); static Shared() { JsonSettings.Converters.Add(new IPAddressConverter()); JsonSettings.Converters.Add(new IPEndPointConverter()); - JsonSettings.Formatting = Formatting.Indented; + JsonSettings.WriteIndented = true; + JsonSettings.IncludeFields = true; } public static object JsonDeserialize(string text, Type type) { - return JsonConvert.DeserializeObject(text, JsonTypeCheck(type), JsonSettings); + return JsonSerializer.Deserialize(text, JsonTypeCheck(type), JsonSettings); } public static T JsonDeserialize(string text) => (T)JsonDeserialize(text, typeof(T)); - public static string JsonSerialize(object obj) => JsonConvert.SerializeObject(JsonTypeCheck(obj), JsonSettings); + public static string JsonSerialize(object obj) => JsonSerializer.Serialize(JsonTypeCheck(obj), JsonSettings); /// /// Shortcut to diff --git a/Core/VehicleWeaponInfo.cs b/Core/VehicleWeaponInfo.cs index d38bf93..4077554 100644 --- a/Core/VehicleWeaponInfo.cs +++ b/Core/VehicleWeaponInfo.cs @@ -3,8 +3,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml; -using Newtonsoft.Json; -using Formatting = Newtonsoft.Json.Formatting; namespace RageCoop.Core { diff --git a/Server/Networking/Server.Background.cs b/Server/Networking/Server.Background.cs index b48fc93..b23d04d 100644 --- a/Server/Networking/Server.Background.cs +++ b/Server/Networking/Server.Background.cs @@ -9,7 +9,6 @@ using System.Text; using System.Threading; using ICSharpCode.SharpZipLib.Zip; using Lidgren.Network; -using Newtonsoft.Json; using RageCoop.Core; namespace RageCoop.Server; diff --git a/Server/Program.cs b/Server/Program.cs index 731a072..61029a9 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -1,6 +1,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Net; using System.Threading; using RageCoop.Core; diff --git a/Server/RageCoop.Server.csproj b/Server/RageCoop.Server.csproj index aec32a3..5a94e76 100644 --- a/Server/RageCoop.Server.csproj +++ b/Server/RageCoop.Server.csproj @@ -60,7 +60,6 @@ - diff --git a/Tools/DataDumper/DataDumper.csproj b/Tools/DataDumper/DataDumper.csproj index 745d8c8..60e736f 100644 --- a/Tools/DataDumper/DataDumper.csproj +++ b/Tools/DataDumper/DataDumper.csproj @@ -8,10 +8,6 @@ $(SolutionDir)bin\Tools\DataDumper - - - - diff --git a/Tools/DataDumper/Program.cs b/Tools/DataDumper/Program.cs index f214572..83474a8 100644 --- a/Tools/DataDumper/Program.cs +++ b/Tools/DataDumper/Program.cs @@ -1,8 +1,7 @@ -using System.Text; +global using static RageCoop.Core.Shared; +using System.Text; using System.Xml; -using Newtonsoft.Json; using RageCoop.Core; -using Formatting = Newtonsoft.Json.Formatting; namespace DataDumper; @@ -33,7 +32,7 @@ public static class Program { Dictionary weapons = new(); foreach (var f in Directory.GetFiles("meta", "*.meta")) Parse(f, weapons); - File.WriteAllText("out/Weapons.json", JsonConvert.SerializeObject(weapons, Formatting.Indented)); + File.WriteAllText("out/Weapons.json", JsonSerialize(weapons)); if (ToGenerate.HasFlag(GenFlags.WeaponHash)) DumpWeaponHash(weapons, true); }