diff options
Diffstat (limited to 'Ryujinx.Common/Utilities/JsonHelper.cs')
-rw-r--r-- | Ryujinx.Common/Utilities/JsonHelper.cs | 122 |
1 files changed, 67 insertions, 55 deletions
diff --git a/Ryujinx.Common/Utilities/JsonHelper.cs b/Ryujinx.Common/Utilities/JsonHelper.cs index 9a2d6f18..36f39114 100644 --- a/Ryujinx.Common/Utilities/JsonHelper.cs +++ b/Ryujinx.Common/Utilities/JsonHelper.cs @@ -1,62 +1,15 @@ -using System.IO; +using Ryujinx.Common.Configuration.Hid; +using Ryujinx.Common.Configuration.Hid.Controller.Motion; +using System.IO; using System.Text; using System.Text.Json; -using System.Text.Json.Serialization.Metadata; +using System.Text.Json.Serialization; namespace Ryujinx.Common.Utilities { public class JsonHelper { - private static readonly JsonNamingPolicy SnakeCasePolicy = new SnakeCaseNamingPolicy(); - private const int DefaultFileWriteBufferSize = 4096; - - /// <summary> - /// Creates new serializer options with default settings. - /// </summary> - /// <remarks> - /// It is REQUIRED for you to save returned options statically or as a part of static serializer context - /// in order to avoid performance issues. You can safely modify returned options for your case before storing. - /// </remarks> - public static JsonSerializerOptions GetDefaultSerializerOptions(bool indented = true) - { - JsonSerializerOptions options = new() - { - DictionaryKeyPolicy = SnakeCasePolicy, - PropertyNamingPolicy = SnakeCasePolicy, - WriteIndented = indented, - AllowTrailingCommas = true, - ReadCommentHandling = JsonCommentHandling.Skip - }; - - return options; - } - - public static string Serialize<T>(T value, JsonTypeInfo<T> typeInfo) - { - return JsonSerializer.Serialize(value, typeInfo); - } - - public static T Deserialize<T>(string value, JsonTypeInfo<T> typeInfo) - { - return JsonSerializer.Deserialize(value, typeInfo); - } - - public static void SerializeToFile<T>(string filePath, T value, JsonTypeInfo<T> typeInfo) - { - using FileStream file = File.Create(filePath, DefaultFileWriteBufferSize, FileOptions.WriteThrough); - JsonSerializer.Serialize(file, value, typeInfo); - } - - public static T DeserializeFromFile<T>(string filePath, JsonTypeInfo<T> typeInfo) - { - using FileStream file = File.OpenRead(filePath); - return JsonSerializer.Deserialize(file, typeInfo); - } - - public static void SerializeToStream<T>(Stream stream, T value, JsonTypeInfo<T> typeInfo) - { - JsonSerializer.Serialize(stream, value, typeInfo); - } + public static JsonNamingPolicy SnakeCase { get; } private class SnakeCaseNamingPolicy : JsonNamingPolicy { @@ -67,7 +20,7 @@ namespace Ryujinx.Common.Utilities return name; } - StringBuilder builder = new(); + StringBuilder builder = new StringBuilder(); for (int i = 0; i < name.Length; i++) { @@ -81,7 +34,7 @@ namespace Ryujinx.Common.Utilities } else { - builder.Append('_'); + builder.Append("_"); builder.Append(char.ToLowerInvariant(c)); } } @@ -94,5 +47,64 @@ namespace Ryujinx.Common.Utilities return builder.ToString(); } } + + static JsonHelper() + { + SnakeCase = new SnakeCaseNamingPolicy(); + } + + public static JsonSerializerOptions GetDefaultSerializerOptions(bool prettyPrint = false) + { + JsonSerializerOptions options = new JsonSerializerOptions + { + DictionaryKeyPolicy = SnakeCase, + PropertyNamingPolicy = SnakeCase, + WriteIndented = prettyPrint, + AllowTrailingCommas = true, + ReadCommentHandling = JsonCommentHandling.Skip + }; + + options.Converters.Add(new JsonStringEnumConverter()); + options.Converters.Add(new JsonInputConfigConverter()); + options.Converters.Add(new JsonMotionConfigControllerConverter()); + + return options; + } + + public static T Deserialize<T>(Stream stream) + { + using (BinaryReader reader = new BinaryReader(stream)) + { + return JsonSerializer.Deserialize<T>(reader.ReadBytes((int)(stream.Length - stream.Position)), GetDefaultSerializerOptions()); + } + } + + public static T DeserializeFromFile<T>(string path) + { + return Deserialize<T>(File.ReadAllText(path)); + } + + public static T Deserialize<T>(string json) + { + return JsonSerializer.Deserialize<T>(json, GetDefaultSerializerOptions()); + } + + public static void Serialize<TValue>(Stream stream, TValue obj, bool prettyPrint = false) + { + using (BinaryWriter writer = new BinaryWriter(stream)) + { + writer.Write(SerializeToUtf8Bytes(obj, prettyPrint)); + } + } + + public static string Serialize<TValue>(TValue obj, bool prettyPrint = false) + { + return JsonSerializer.Serialize(obj, GetDefaultSerializerOptions(prettyPrint)); + } + + public static byte[] SerializeToUtf8Bytes<T>(T obj, bool prettyPrint = false) + { + return JsonSerializer.SerializeToUtf8Bytes(obj, GetDefaultSerializerOptions(prettyPrint)); + } } -}
\ No newline at end of file +} |