Skip to content

Instantly share code, notes, and snippets.

@MuhammadSulaiman001
Last active February 25, 2024 05:47
Show Gist options
  • Save MuhammadSulaiman001/90c17d863341029a1644ae654945df9c to your computer and use it in GitHub Desktop.
Save MuhammadSulaiman001/90c17d863341029a1644ae654945df9c to your computer and use it in GitHub Desktop.
WIP

Useful newtonsoft utilities (3 files)

using Newtonsoft.Json;
namespace Utils.Newtonsoft;
/*
Usage:
[JsonConverter(typeof(AbstractListPropertyConverter<IEdge, ConcreteEdge>))]
public List<IEdge> Edges { get; set; }
*/
public class AbstractListPropertyConverter<TInterface, TImplementation> : JsonConverter
where TImplementation : TInterface
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// todo: why not passing only the concrete like this?
// var res = serializer.Deserialize<List<TImplementation>>(reader);
var res = serializer.Deserialize<List<TInterface>>(reader);
return res.Select(item => (TImplementation)item).ToList();
}
public override bool CanConvert(Type objectType)
{
// todo: why not return this?
// return objectType == typeof(TImplementation);
return objectType == typeof(TInterface);
}
}
using Newtonsoft.Json;
namespace Utils.Newtonsoft;
/*
Usage:
[JsonConverter(typeof(AbstractPropertyConverter<ConcreteEdge>))]
public IEdge Edge { get; set; }
*/
public class AbstractPropertyConverter<TImplementation> : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return serializer.Deserialize<TImplementation>(reader);
}
public override bool CanConvert(Type objectType)
{
return true;
}
}
using Newtonsoft.Json;
namespace Utils.Newtonsoft;
/// <summary>
/// Usage: you must declare a settings object and pass it to `DeserializeObject` method, for example:
/// 1. `var conv = new JsonConverterInstance[TAbstract, TConcrete]();`
/// 2. `JsonConvert.DeserializeObject(json, type, settings);`
/// Full Example in NewtonsoftTests.cs
/// </summary>
internal class JsonConverterInstance<TAbstract, TReal>
: JsonConverter where TReal : TAbstract // where TReal : class, TAbstract, new()
{
public override bool CanConvert(Type objectType)
=> objectType == typeof(TAbstract);
public override object ReadJson(JsonReader reader, Type type, object value, JsonSerializer jser)
=> jser.Deserialize<TReal>(reader);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer jser)
=> jser.Serialize(writer, value);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment