using System.Collections; using System.Text.Encodings.Web; using System.Text.Json; using System.Text.Json.Serialization; using System.Text.Unicode; using Milimoe.FunGame.Core.Library.Common.Architecture; using Milimoe.FunGame.Core.Service; namespace Milimoe.FunGame.Core.Api.Utility { /// /// Json工具类 /// 此工具类拥有单独的序列化选项,支持添加自定义转换器 /// 继承自 /// public class JsonTool { /// /// 默认的序列化选项 /// public static JsonSerializerOptions JsonSerializerOptions => JsonManager.GeneralOptions; /// /// 序列化选项 /// public JsonSerializerOptions Options { get; set; } = new(); /// /// 创建一个Json工具类 /// 此工具类拥有单独的序列化选项,支持添加自定义转换器 /// 继承自 /// public JsonTool() { Options.WriteIndented = JsonSerializerOptions.WriteIndented; Options.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); Options.ReferenceHandler = ReferenceHandler.IgnoreCycles; foreach (JsonConverter converter in JsonSerializerOptions.Converters) { Options.Converters.Add(converter); } } /// /// 注册一个自定义转换器,支持 /// /// public void AddConverter(JsonConverter converter) { if (!Options.Converters.Contains(converter)) Options.Converters.Add(converter); } /// /// 注册多个自定义转换器,支持 /// /// public void AddConverters(IEnumerable converters) { foreach (JsonConverter converter in converters) { AddConverter(converter); } } /// /// 获取Json字符串 /// /// /// /// public string GetString(T obj) => JsonManager.GetString(obj, Options); /// /// 反序列化Json对象 /// /// /// /// public T? GetObject(string json) => JsonManager.GetObject(json, Options); /// /// 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别 /// /// /// public object? GetObject(string json) => JsonManager.GetObject(json, Options); /// /// 反序列化Hashtable中Key对应的Json对象 /// /// /// /// /// public T? GetObject(Hashtable table, string key) => JsonManager.GetObject(table, key, Options); /// /// 反序列化Dictionary中Key对应的Json对象 /// /// /// /// /// public T? GetObject(Dictionary dict, string key) => JsonManager.GetObject(dict, key, Options); /// /// 反序列化IEnumerable中的Json对象 可指定反序列化选项 /// /// /// /// /// public T? JsonDeserializeFromIEnumerable(IEnumerable e, int index) => JsonManager.GetObject(e, index, Options); /// /// 反序列化多个Json对象 /// 注意必须是相同的Json对象才可以使用此方法解析 /// /// /// /// public List GetObjects(string json) => JsonManager.GetObjects(json, Options); } }