|
@@ -32,6 +32,17 @@ namespace InABox.Core
|
|
|
{
|
|
|
//private static JsonSerializerOptions? _serializerSettings;
|
|
|
|
|
|
+ private static JsonConverter[]? _converters;
|
|
|
+
|
|
|
+ private static JsonConverter[] GetConverters()
|
|
|
+ {
|
|
|
+ _converters ??= CoreUtils.Entities.Where(x => typeof(JsonConverter).IsAssignableFrom(x))
|
|
|
+ .Select(x => Activator.CreateInstance(x) as JsonConverter)
|
|
|
+ .NotNull()
|
|
|
+ .ToArray();
|
|
|
+ return _converters;
|
|
|
+ }
|
|
|
+
|
|
|
private static JsonSerializerOptions SerializerSettings(bool indented = true)
|
|
|
{
|
|
|
var serializerSettings = CreateSerializerSettings();
|
|
@@ -42,22 +53,14 @@ namespace InABox.Core
|
|
|
|
|
|
public static JsonSerializerOptions CreateSerializerSettings(bool indented = true)
|
|
|
{
|
|
|
- var settings = new JsonSerializerOptions
|
|
|
- {
|
|
|
- // DateParseHandling = DateParseHandling.DateTime,
|
|
|
- // DateFormatHandling = DateFormatHandling.IsoDateFormat,
|
|
|
- // DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
|
|
|
- };
|
|
|
-
|
|
|
- settings.Converters.Add(new CoreTableJsonConverter());
|
|
|
+ var settings = new JsonSerializerOptions { };
|
|
|
|
|
|
- settings.Converters.Add(new FilterJsonConverter());
|
|
|
- settings.Converters.Add(new ColumnJsonConverter());
|
|
|
- settings.Converters.Add(new SortOrderJsonConverter());
|
|
|
- settings.Converters.Add(new UserPropertiesJsonConverter());
|
|
|
- // settings.Converters.Add(new BaseObjectJSONConverter());
|
|
|
+ foreach (var converter in GetConverters())
|
|
|
+ {
|
|
|
+ settings.Converters.Add(converter);
|
|
|
+ }
|
|
|
|
|
|
- settings.WriteIndented = indented; // ? Formatting.Indented : Formatting.None;
|
|
|
+ settings.WriteIndented = indented;
|
|
|
return settings;
|
|
|
}
|
|
|
|
|
@@ -71,21 +74,8 @@ namespace InABox.Core
|
|
|
{
|
|
|
var settings = SerializerSettings(indented);
|
|
|
JsonSerializer.Serialize(stream, o, settings);
|
|
|
- // using (var sw = new StreamWriter(stream))
|
|
|
- // {
|
|
|
- // using (JsonWriter writer = new JsonTextWriter(sw))
|
|
|
- // {
|
|
|
- // var serializer = JsonSerializer.Create(settings);
|
|
|
- // serializer.Serialize(writer, o);
|
|
|
- // }
|
|
|
- // }
|
|
|
}
|
|
|
|
|
|
- // public static void DeserializeInto(string json, object target)
|
|
|
- // {
|
|
|
- // JsonConvert.PopulateObject(json, target, SerializerSettings());
|
|
|
- // }
|
|
|
-
|
|
|
[return: MaybeNull]
|
|
|
public static T Deserialize<T>(Stream? stream, bool strict = false)
|
|
|
{
|
|
@@ -96,10 +86,6 @@ namespace InABox.Core
|
|
|
{
|
|
|
var settings = SerializerSettings();
|
|
|
return JsonSerializer.Deserialize<T>(stream, settings);
|
|
|
- // using var sr = new StreamReader(stream);
|
|
|
- // using JsonReader reader = new JsonTextReader(sr);
|
|
|
- // var serializer = JsonSerializer.Create(settings);
|
|
|
- // return serializer.Deserialize<T>(reader);
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
@@ -119,47 +105,10 @@ namespace InABox.Core
|
|
|
object? result = null;
|
|
|
var settings = SerializerSettings();
|
|
|
result = JsonSerializer.Deserialize(stream, type, settings);
|
|
|
- // using (var sr = new StreamReader(stream))
|
|
|
- // {
|
|
|
- // using (JsonReader reader = new JsonTextReader(sr))
|
|
|
- // {
|
|
|
- // var serializer = JsonSerializer.Create(settings);
|
|
|
- // result = serializer.Deserialize(reader, type);
|
|
|
- // }
|
|
|
- // }
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- // [return: MaybeNull]
|
|
|
- // public static T Deserialize<T>(JToken obj, bool strict = false)
|
|
|
- // {
|
|
|
- // var ret = default(T);
|
|
|
- // try
|
|
|
- // {
|
|
|
- // var settings = SerializerSettings();
|
|
|
- // var serializer = JsonSerializer.Create(settings);
|
|
|
- // return obj.ToObject<T>();
|
|
|
- // }
|
|
|
- // catch (Exception)
|
|
|
- // {
|
|
|
- // if (strict)
|
|
|
- // {
|
|
|
- // throw;
|
|
|
- // }
|
|
|
- // if (typeof(T).IsArray)
|
|
|
- // {
|
|
|
- // ret = (T)(object)Array.CreateInstance(typeof(T).GetElementType(), 0);
|
|
|
- // }
|
|
|
- // else
|
|
|
- // {
|
|
|
- // ret = Activator.CreateInstance<T>();
|
|
|
- // }
|
|
|
- // }
|
|
|
- //
|
|
|
- // return ret;
|
|
|
- // }
|
|
|
-
|
|
|
[return: MaybeNull]
|
|
|
public static T Deserialize<T>(string? json, bool strict = false) // where T : new()
|
|
|
{
|
|
@@ -170,19 +119,9 @@ namespace InABox.Core
|
|
|
try
|
|
|
{
|
|
|
var settings = SerializerSettings();
|
|
|
- //if (typeof(T).IsSubclassOf(typeof(BaseObject)))
|
|
|
- //{
|
|
|
- // ret = Activator.CreateInstance<T>();
|
|
|
- // (ret as BaseObject).SetObserving(false);
|
|
|
- // JsonConvert.PopulateObject(json, ret, settings);
|
|
|
- // (ret as BaseObject).SetObserving(true);
|
|
|
- //}
|
|
|
- //else
|
|
|
if (typeof(T).IsArray)
|
|
|
{
|
|
|
ret = JsonSerializer.Deserialize<T>(json, settings);
|
|
|
- //object o = Array.CreateInstance(typeof(T).GetElementType(), 0);
|
|
|
- //ret = (T)o;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -219,14 +158,6 @@ namespace InABox.Core
|
|
|
try
|
|
|
{
|
|
|
var settings = SerializerSettings();
|
|
|
- //if (typeof(T).IsSubclassOf(typeof(BaseObject)))
|
|
|
- //{
|
|
|
- // ret = Activator.CreateInstance<T>();
|
|
|
- // (ret as BaseObject).SetObserving(false);
|
|
|
- // JsonConvert.PopulateObject(json, ret, settings);
|
|
|
- // (ret as BaseObject).SetObserving(true);
|
|
|
- //}
|
|
|
- //else
|
|
|
if (T.IsArray)
|
|
|
{
|
|
|
object o = Array.CreateInstance(T.GetElementType(), 0);
|
|
@@ -962,81 +893,4 @@ namespace InABox.Core
|
|
|
WriteJson(writer, value);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- public class BaseObjectJSONConverter : CustomJsonConverter<BaseObject>
|
|
|
- {
|
|
|
- public override bool CanConvert(Type objectType)
|
|
|
- {
|
|
|
- return objectType.IsSubclassOf(typeof(BaseObject));
|
|
|
- }
|
|
|
-
|
|
|
- public override BaseObject? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
|
|
- {
|
|
|
- BaseObject obj = (Activator.CreateInstance(typeToConvert) as BaseObject)!;
|
|
|
- obj.OriginalValues ??= new ConcurrentDictionary<string, object?>();
|
|
|
- obj.SetObserving(false);
|
|
|
-
|
|
|
- if (reader.TokenType == JsonTokenType.StartObject)
|
|
|
- {
|
|
|
- reader.Read();
|
|
|
- while (reader.TokenType != JsonTokenType.EndObject)
|
|
|
- {
|
|
|
- if (reader.TokenType != JsonTokenType.PropertyName)
|
|
|
- throw new JsonException("Expected PropertyName token.");
|
|
|
-
|
|
|
- string propertyName = reader.GetString();
|
|
|
- reader.Read(); // Advance to the property value
|
|
|
-
|
|
|
- if (Equals(propertyName, "OriginalValues"))
|
|
|
- {
|
|
|
- while (reader.Read())
|
|
|
- {
|
|
|
- if (reader.TokenType == JsonTokenType.EndObject)
|
|
|
- break;
|
|
|
- string? name = reader.GetString();
|
|
|
- reader.Read();
|
|
|
- if (!string.IsNullOrWhiteSpace(name))
|
|
|
- obj.OriginalValues[name] = ReadJson(ref reader);
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- else if (DatabaseSchema.Property(typeToConvert, propertyName) is IProperty prop)
|
|
|
- {
|
|
|
- var value = ReadJson(ref reader);
|
|
|
- prop.Setter()(obj, value);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- obj.SetObserving(true);
|
|
|
- return obj;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- public override void Write(Utf8JsonWriter writer, BaseObject obj, JsonSerializerOptions options)
|
|
|
- {
|
|
|
- writer.WriteStartObject();
|
|
|
- writer.WritePropertyName("OriginalValues");
|
|
|
- writer.WriteStartObject();
|
|
|
- if (obj.OriginalValues != null)
|
|
|
- {
|
|
|
- foreach (var key in obj.OriginalValues.Keys)
|
|
|
- {
|
|
|
- var val = obj.OriginalValues[key];
|
|
|
- if (val == null)
|
|
|
- writer.WriteNull(key);
|
|
|
- else
|
|
|
- writer.WriteString(key, val.ToString());
|
|
|
- }
|
|
|
- }
|
|
|
- foreach(var property in DatabaseSchema.Properties(obj.GetType()))
|
|
|
- {
|
|
|
- var val = property.Getter()(obj);
|
|
|
- WriteJson(writer, property.Name, property.Getter());
|
|
|
- }
|
|
|
- writer.WriteEndObject();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
}
|