JsonHelper.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using Ryujinx.Common.Configuration.Hid;
  2. using Ryujinx.Common.Configuration.Hid.Controller.Motion;
  3. using System.IO;
  4. using System.Text;
  5. using System.Text.Json;
  6. using System.Text.Json.Serialization;
  7. namespace Ryujinx.Common.Utilities
  8. {
  9. public class JsonHelper
  10. {
  11. public static JsonNamingPolicy SnakeCase { get; }
  12. private class SnakeCaseNamingPolicy : JsonNamingPolicy
  13. {
  14. public override string ConvertName(string name)
  15. {
  16. if (string.IsNullOrEmpty(name))
  17. {
  18. return name;
  19. }
  20. StringBuilder builder = new StringBuilder();
  21. for (int i = 0; i < name.Length; i++)
  22. {
  23. char c = name[i];
  24. if (char.IsUpper(c))
  25. {
  26. if (i == 0 || char.IsUpper(name[i - 1]))
  27. {
  28. builder.Append(char.ToLowerInvariant(c));
  29. }
  30. else
  31. {
  32. builder.Append("_");
  33. builder.Append(char.ToLowerInvariant(c));
  34. }
  35. }
  36. else
  37. {
  38. builder.Append(c);
  39. }
  40. }
  41. return builder.ToString();
  42. }
  43. }
  44. static JsonHelper()
  45. {
  46. SnakeCase = new SnakeCaseNamingPolicy();
  47. }
  48. public static JsonSerializerOptions GetDefaultSerializerOptions(bool prettyPrint = false)
  49. {
  50. JsonSerializerOptions options = new JsonSerializerOptions
  51. {
  52. DictionaryKeyPolicy = SnakeCase,
  53. PropertyNamingPolicy = SnakeCase,
  54. WriteIndented = prettyPrint,
  55. AllowTrailingCommas = true,
  56. ReadCommentHandling = JsonCommentHandling.Skip
  57. };
  58. options.Converters.Add(new JsonStringEnumConverter());
  59. options.Converters.Add(new JsonInputConfigConverter());
  60. options.Converters.Add(new JsonMotionConfigControllerConverter());
  61. return options;
  62. }
  63. public static T Deserialize<T>(Stream stream)
  64. {
  65. using (BinaryReader reader = new BinaryReader(stream))
  66. {
  67. return JsonSerializer.Deserialize<T>(reader.ReadBytes((int)(stream.Length - stream.Position)), GetDefaultSerializerOptions());
  68. }
  69. }
  70. public static T DeserializeFromFile<T>(string path)
  71. {
  72. return Deserialize<T>(File.ReadAllText(path));
  73. }
  74. public static T Deserialize<T>(string json)
  75. {
  76. return JsonSerializer.Deserialize<T>(json, GetDefaultSerializerOptions());
  77. }
  78. public static void Serialize<TValue>(Stream stream, TValue obj, bool prettyPrint = false)
  79. {
  80. using (BinaryWriter writer = new BinaryWriter(stream))
  81. {
  82. writer.Write(SerializeToUtf8Bytes(obj, prettyPrint));
  83. }
  84. }
  85. public static string Serialize<TValue>(TValue obj, bool prettyPrint = false)
  86. {
  87. return JsonSerializer.Serialize(obj, GetDefaultSerializerOptions(prettyPrint));
  88. }
  89. public static byte[] SerializeToUtf8Bytes<T>(T obj, bool prettyPrint = false)
  90. {
  91. return JsonSerializer.SerializeToUtf8Bytes(obj, GetDefaultSerializerOptions(prettyPrint));
  92. }
  93. }
  94. }