JsonHelper.cs 3.3 KB

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