Advertisement
waygeek

Json

Jan 25th, 2024
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.37 KB | None | 0 0
  1.  
  2. //JSON file
  3. {
  4.   "STR": 2,
  5.   "INT": 3,
  6.   "DEX": 4,
  7.   "StatsAvailable": 7
  8. }
  9.  
  10. //Program.cs
  11. using Newtonsoft.Json;
  12.  
  13. Player player = DataService.Load<Player>(nameof(Player));
  14.  
  15. // DataService.Save(nameof(Player), player);
  16. Console.WriteLine($"TEST: {player.STR.Value}");
  17.  
  18. string json = JsonConvert.SerializeObject(player, Formatting.Indented);
  19.  
  20. Console.WriteLine(json);
  21.  
  22.  
  23. [Serializable]
  24. public class Player
  25. {
  26.     public readonly ReactiveProperty<int> STR = new ReactiveProperty<int>();
  27.     public readonly ReactiveProperty<int> INT = new ReactiveProperty<int>();
  28.     public readonly ReactiveProperty<int> DEX = new ReactiveProperty<int>();
  29.  
  30.     public int StatsAvailable;
  31.  
  32.     public Player()
  33.     {
  34.         STR.Value = 0;
  35.         INT.Value = 0;
  36.         DEX.Value = 0;
  37.         StatsAvailable = 10;
  38.     }
  39. }
  40.  
  41. public class ReactiveProperty<T>
  42. {
  43.     public event Action<T> OnChanged;
  44.  
  45.     private T _value;
  46.  
  47.     public T Value
  48.     {
  49.         get => _value;
  50.         set
  51.         {
  52.             _value = value;
  53.             OnChanged?.Invoke(_value);
  54.         }
  55.     }
  56. }
  57.  
  58. using Newtonsoft.Json;
  59.  
  60. public static class DataService
  61. {
  62.     public static void Save<T>(string key, T data)
  63.     {
  64.         string filePath = GetFilePath(key);
  65.  
  66.         string jsonDataString = JsonConvert.SerializeObject(data, new JsonSerializerSettings
  67.         {
  68.             Formatting = Formatting.Indented,
  69.             TypeNameHandling = TypeNameHandling.Auto,
  70.             Converters = new List<JsonConverter> { new ReactivePropertyConverter() }
  71.         });
  72.  
  73.         // Запис у файл за допомогою StreamWriter.
  74.         File.WriteAllText(filePath, jsonDataString);
  75.     }
  76.  
  77.     public static T Load<T>(string key) where T : new()
  78.     {
  79.         string filePath = GetFilePath(key);
  80.  
  81.         if (!File.Exists(filePath))
  82.         {
  83.             return new T();
  84.         }
  85.  
  86.         string json = File.ReadAllText(filePath);
  87.  
  88.         var jc = JsonConvert.DeserializeObject<T>(json, new JsonSerializerSettings
  89.         {
  90.             // Ті ж налаштування, що і при серіалізації
  91.             Formatting = Formatting.Indented,
  92.             TypeNameHandling = TypeNameHandling.Auto,
  93.             Converters = new List<JsonConverter> { new ReactivePropertyConverter() }
  94.         });
  95.  
  96.         return jc!;
  97.     }
  98.  
  99.     private static string GetFilePath(string key)
  100.     {
  101.         return Path.Combine(Directory.GetCurrentDirectory(), key + ".json");
  102.     }
  103. }
  104.  
  105. using Newtonsoft.Json;
  106. using Newtonsoft.Json.Linq;
  107.  
  108. public class ReactivePropertyConverter : JsonConverter
  109. {
  110.     public override bool CanConvert(Type objectType)
  111.     {
  112.         return objectType.IsGenericType &&
  113.             objectType.GetGenericTypeDefinition() == typeof(ReactiveProperty<>) ||
  114.             objectType.GetProperty("Value") != null;
  115.     }
  116.  
  117.     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  118.     {
  119.          if (reader.TokenType == JsonToken.StartObject)
  120.         {
  121.             JToken token = JToken.Load(reader);
  122.             return token.ToObject(objectType, serializer);
  123.         }
  124.         else if (objectType.IsGenericType && objectType.GetGenericTypeDefinition() == typeof(ReactiveProperty<>))
  125.         {
  126.             Type valueType = objectType.GetGenericArguments()[0];
  127.             object value = serializer.Deserialize(reader, valueType);
  128.  
  129.             var reactiveProp = Activator.CreateInstance(objectType);
  130.             objectType.GetProperty("Value").SetValue(reactiveProp, value);
  131.  
  132.             return reactiveProp;
  133.         }
  134.  
  135.         throw new JsonSerializationException("Неочікуваний формат JSON для ReactiveProperty.");
  136.     }
  137.  
  138.     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  139.     {
  140.         // Серіалізація
  141.         var token = JToken.FromObject(value);
  142.  
  143.         if (token.Type == JTokenType.Object && value.GetType().IsGenericType && value.GetType().GetGenericTypeDefinition() == typeof(ReactiveProperty<>))
  144.         {
  145.             // Якщо це ReactiveProperty, серіалізуємо тільки Value
  146.             var valProp = value.GetType().GetProperty("Value");
  147.             var val = valProp.GetValue(value);
  148.             token = JToken.FromObject(val);
  149.         }
  150.  
  151.         token.WriteTo(writer);
  152.     }
  153. }
  154.  
  155.  
Tags: JSON
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement