Newer
Older
Qwilight / Qwilight / Utilities / JSONUtility.cs
@Taehui Taehui on 15 Nov 2 KB 2023-11-15 오후 11:18
using Qwilight.XOR;
using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Qwilight.Utilities
{
    public static partial class Utility
    {
        public sealed class XORInt32Modifier : JsonConverter<XORInt32>
        {
            public override XORInt32 Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => (XORInt32)Utility.ToInt32(reader.GetString());

            public override void Write(Utf8JsonWriter writer, XORInt32 value, JsonSerializerOptions options) => writer.WriteNumberValue(value);
        }

        public sealed class XORFloat64Modifier : JsonConverter<XORFloat64>
        {
            public override XORFloat64 Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => (XORFloat64)Utility.ToFloat64(reader.GetString());

            public override void Write(Utf8JsonWriter writer, XORFloat64 value, JsonSerializerOptions options) => writer.WriteNumberValue(value);
        }

        static readonly JsonSerializerOptions _defaultGetJSONConfigure = new()
        {
            IncludeFields = true
        };
        static readonly JsonSerializerOptions _defaultSetJSONConfigure = new()
        {
            Converters =
            {
                new XORInt32Modifier(),
                new XORFloat64Modifier()
            },
            IncludeFields = true,
            WriteIndented = QwilightComponent.IsVS
        };

        public static T GetJSON<T>(string text, JsonSerializerOptions defaultJSONConfigure = null) => JsonSerializer.Deserialize<T>(text, defaultJSONConfigure ?? _defaultGetJSONConfigure);

        public static T GetJSON<T>(byte[] data) => JsonSerializer.Deserialize<T>(data, _defaultGetJSONConfigure);

        public static async ValueTask<T> GetJSON<T>(Stream s) => await JsonSerializer.DeserializeAsync<T>(s, _defaultGetJSONConfigure);

        public static string SetJSON<T>(T data, JsonSerializerOptions defaultJSONConfigure = null) => JsonSerializer.Serialize(data, defaultJSONConfigure ?? _defaultSetJSONConfigure);
    }
}