using System.Text.Json; using System.Text.Json.Serialization; using Milimoe.FunGame.Core.Library.Common.JsonConverter; using Milimoe.FunGame.Core.Library.Common.Network; namespace Milimoe.FunGame.Core.Service { internal class JsonManager { private static bool _IsFirst = true; private readonly static JsonSerializerOptions _GeneralOptions = new() { WriteIndented = true, ReferenceHandler = ReferenceHandler.IgnoreCycles }; /// /// 默认的JsonSerializerOptions /// internal static JsonSerializerOptions GeneralOptions { get { if (_IsFirst) { // 首次使用时,向其添加自定义转换器 _IsFirst = false; AddConverter(new DataSetConverter()); AddConverter(new DateTimeConverter()); } return _GeneralOptions; } } /// /// 注册一个自定义转换器 /// /// internal static void AddConverter(JsonConverter converter) { _GeneralOptions.Converters.Add(converter); } /// /// 获取Json字符串 /// /// /// /// internal static string GetString(T obj) { return JsonSerializer.Serialize(obj, GeneralOptions); } /// /// 反序列化Json对象 /// /// /// /// internal static T? GetObject(string json) { return JsonSerializer.Deserialize(json, GeneralOptions); } /// /// 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别 /// /// /// internal static object? GetObject(string json) { return JsonSerializer.Deserialize(json, GeneralOptions); } /// /// 反序列化多个Json对象 /// 注意必须是相同的Json对象才可以使用此方法解析 /// /// /// /// internal static List GetObjects(string json) { json = "[" + json.Replace("}{", "},{") + "]"; // 将Json字符串转换为数组 return JsonSerializer.Deserialize>(json, GeneralOptions) ?? new List(); } /// /// 反序列化SocketObject中索引为index的Json对象 /// /// /// /// /// /// internal static T? GetObject(SocketObject obj, int index) { if (index >= obj.Parameters.Length) throw new IndexOutOfArrayLengthException(); JsonElement element = (JsonElement)obj.Parameters[index]; T? result = element.Deserialize(GeneralOptions); return result; } } }