using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace Serein.Library.Api { /// /// JSON数据交互的Token接口,允许使用不同的JSON库进行数据处理。 /// public interface IJsonToken { /// /// 获取 Token /// /// /// IJsonToken this[object name] { get; } /* /// /// 获取 Token 数组的元素,允许通过索引访问数组中的元素。 /// /// /// IJsonToken this[int index] { get; }*/ /// /// 获取指定名称的属性,如果存在则返回true,并通过out参数返回对应的IJsonToken对象。 /// /// /// /// bool TryGetValue(string name, out IJsonToken token); /// /// 获取指定名称的属性值,如果不存在则返回null。 /// /// /// #nullable enable IJsonToken? GetValue(string name); /// /// 获取当前Token的字符串值,如果是null则返回null。 /// /// string GetString(); /// /// 获取当前Token的整数值,如果是null则抛出异常。 /// /// int GetInt32(); /// /// 获取当前Token的布尔值,如果是null则抛出异常。 /// /// bool GetBoolean(); /// /// 判断当前Token是否为null。 /// bool IsNull { get; } /// /// 枚举当前Token作为数组时的所有元素,返回一个IEnumerable<IJsonTokens>。 /// /// IEnumerable EnumerateArray(); /// /// 将当前Token转换为指定类型的对象。 /// /// /// T ToObject(); /// /// 将当前Token转换为指定类型的对象。 /// /// /// object ToObject(Type type); /// /// 将当前Token转换为字符串表示形式。 /// /// string ToString(); } /// /// 使用Json进行数据交互的门户,允许外部使用第三方JSON库进行数据处理。 /// public interface IJsonProvider { /// /// JSON文本转为指定类型 /// /// /// /// T Deserialize(string jsonText); /// /// JSON文本转为指定类型 /// /// /// /// object Deserialize(string jsonText, Type type); /// /// 从对象转换为JSON文本 /// /// /// string Serialize(object obj); /// /// 解析为Token /// /// /// IJsonToken Parse(string json); /// /// 创建对象 /// /// /// IJsonToken CreateObject(IDictionary? values = null); /// /// 创建数组 /// /// /// IJsonToken CreateArray(IEnumerable? values = null); /// /// 将对象转换为JSON Token,自动转换为 JObject/JArray。 /// /// /// IJsonToken FromObject(object obj); } } /* using System.Text.Json; public class SystemTextJsonToken : IJsonToken { private readonly JsonElement _element; public SystemTextJsonToken(JsonElement element) => _element = element; public bool TryGetProperty(string name, out IJsonToken token) { if (_element.TryGetProperty(name, out var property)) { token = new SystemTextJsonToken(property); return true; } token = null; return false; } public string GetString() => _element.ValueKind == JsonValueKind.Null ? null : _element.GetString(); public int GetInt32() => _element.GetInt32(); public bool GetBoolean() => _element.GetBoolean(); public bool IsNull => _element.ValueKind == JsonValueKind.Null; public IEnumerable EnumerateArray() { if (_element.ValueKind == JsonValueKind.Array) return _element.EnumerateArray().Select(e => new SystemTextJsonToken(e)); return Enumerable.Empty(); } } public class SystemTextJsonProvider : IJsonProvider { public string Serialize(object obj) => JsonSerializer.Serialize(obj); public T Deserialize(string json) => JsonSerializer.Deserialize(json); public IJsonToken Parse(string json) => new SystemTextJsonToken(JsonDocument.Parse(json).RootElement); } public T ToObject() { // JsonElement -> string -> T return JsonSerializer.Deserialize(_element.GetRawText()); } public IJsonToken CreateObject(IDictionary values = null) { string json = values == null ? "{}" : JsonSerializer.Serialize(values); return Parse(json); } public IJsonToken CreateArray(IEnumerable values = null) { string json = values == null ? "[]" : JsonSerializer.Serialize(values); return Parse(json); } public IJsonToken FromObject(object obj) { string json = JsonSerializer.Serialize(obj); return Parse(json); } */ /* using Newtonsoft.Json.Linq; public class NewtonsoftJsonToken : IJsonToken { private readonly JToken _token; public NewtonsoftJsonToken(JToken token) => _token = token; public bool TryGetProperty(string name, out IJsonToken token) { if (_token is JObject obj && obj.TryGetValue(name, out var value)) { token = new NewtonsoftJsonToken(value); return true; } token = null; return false; } public string GetString() => _token.Type == JTokenType.Null ? null : _token.ToString(); public int GetInt32() => _token.Value(); public bool GetBoolean() => _token.Value(); public bool IsNull => _token.Type == JTokenType.Null; public IEnumerable EnumerateArray() { if (_token is JArray array) return array.Select(x => new NewtonsoftJsonToken(x)); return Enumerable.Empty(); } } public class NewtonsoftJsonProvider : IJsonProvider { public string Serialize(object obj) => JsonConvert.SerializeObject(obj); public T Deserialize(string json) => JsonConvert.DeserializeObject(json); public IJsonToken Parse(string json) => new NewtonsoftJsonToken(JToken.Parse(json)); } public T ToObject() { return _token.ToObject(); } public IJsonToken CreateObject(IDictionary values = null) { var obj = new JObject(); if (values != null) { foreach (var kvp in values) { obj[kvp.Key] = kvp.Value == null ? JValue.CreateNull() : JToken.FromObject(kvp.Value); } } return new NewtonsoftJsonToken(obj); } public IJsonToken CreateArray(IEnumerable values = null) { var array = values != null ? new JArray(values.Select(JToken.FromObject)) : new JArray(); return new NewtonsoftJsonToken(array); } public IJsonToken FromObject(object obj) { if (obj == null) return new NewtonsoftJsonToken(JValue.CreateNull()); if (obj is System.Collections.IEnumerable && !(obj is string)) return new NewtonsoftJsonToken(JArray.FromObject(obj)); return new NewtonsoftJsonToken(JObject.FromObject(obj)); } */