aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Common/Utilities/JsonHelper.cs
diff options
context:
space:
mode:
authorAndrey Sukharev <SukharevAndrey@users.noreply.github.com>2023-04-03 13:14:19 +0300
committerGitHub <noreply@github.com>2023-04-03 10:14:19 +0000
commit3249f8ff41446b47cf458bbc04f8c27e005889aa (patch)
tree72e1087e8b58afe416d66afb6b7a3c4761bef425 /Ryujinx.Common/Utilities/JsonHelper.cs
parent1b41b285ac7f551c3495ced436ce3930ad7223b4 (diff)
Source generated json serializers (#4582)1.1.693
* Use source generated json serializers in order to improve code trimming * Use strongly typed github releases model to fetch updates instead of raw Newtonsoft.Json parsing * Use separate model for LogEventArgs serialization * Make dynamic object formatter static. Fix string builder pooling. * Do not inherit json version of LogEventArgs from EventArgs * Fix extra space in object formatting * Write log json directly to stream instead of using buffer writer * Rebase fixes * Rebase fixes * Rebase fixes * Enforce block-scoped namespaces in the solution. Convert style for existing code * Apply suggestions from code review Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Rebase indent fix * Fix indent * Delete unnecessary json properties * Rebase fix * Remove overridden json property names as they are handled in the options * Apply suggestions from code review Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> * Use default json options in github api calls * Indentation and spacing fixes * Fix json serialization * Fix missing JsonConverter for config enums * Add double \n\n after the whole string, not inside join --------- Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
Diffstat (limited to 'Ryujinx.Common/Utilities/JsonHelper.cs')
-rw-r--r--Ryujinx.Common/Utilities/JsonHelper.cs122
1 files changed, 55 insertions, 67 deletions
diff --git a/Ryujinx.Common/Utilities/JsonHelper.cs b/Ryujinx.Common/Utilities/JsonHelper.cs
index 36f39114..9a2d6f18 100644
--- a/Ryujinx.Common/Utilities/JsonHelper.cs
+++ b/Ryujinx.Common/Utilities/JsonHelper.cs
@@ -1,15 +1,62 @@
-using Ryujinx.Common.Configuration.Hid;
-using Ryujinx.Common.Configuration.Hid.Controller.Motion;
-using System.IO;
+using System.IO;
using System.Text;
using System.Text.Json;
-using System.Text.Json.Serialization;
+using System.Text.Json.Serialization.Metadata;
namespace Ryujinx.Common.Utilities
{
public class JsonHelper
{
- public static JsonNamingPolicy SnakeCase { get; }
+ 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);
+ }
private class SnakeCaseNamingPolicy : JsonNamingPolicy
{
@@ -20,7 +67,7 @@ namespace Ryujinx.Common.Utilities
return name;
}
- StringBuilder builder = new StringBuilder();
+ StringBuilder builder = new();
for (int i = 0; i < name.Length; i++)
{
@@ -34,7 +81,7 @@ namespace Ryujinx.Common.Utilities
}
else
{
- builder.Append("_");
+ builder.Append('_');
builder.Append(char.ToLowerInvariant(c));
}
}
@@ -47,64 +94,5 @@ 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