-1

I am trying to switch over to System.Text.Json and I had some converters that don't seem to be portion over very well. My classes are all based on "pure" interfaces so I have a lot of List and I'm running into a brick wall trying to resolve it. With Json.Net I had a class that looked like this that I could decorate the properties with to do the conversion.

public class ConcreteListConverter<TInterface,TConcrete> : JsonConverter where TInterface : class
{

    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson([NotNull] JsonReader reader, Type objectType, object existingValue, [NotNull] JsonSerializer serializer)
    { 
        var results = serializer.Deserialize<List<TConcrete>>(reader);          
        return results.Select(item => item as TInterface).ToList();
    }

    public override void WriteJson([NotNull] JsonWriter writer, [NotNull] object value, [NotNull] JsonSerializer serializer)
    { 
        serializer.Serialize(writer, value);
    }
} 

dbc
  • 104,963
  • 20
  • 228
  • 340

1 Answers1

-1

Ok this solution managed to function and pass my initial tests.

public class InterfaceListConverter<TInterface, TConcrete> : JsonConverter<List<TInterface>>
    where TConcrete : TInterface
{
    public override List<TInterface> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        var list = new List<TInterface>();
        while (reader.Read())
        {
            if (reader.TokenType == JsonTokenType.EndArray)
            {
                break;
            }
            var concrete = JsonSerializer.Deserialize<TConcrete>(ref reader, options);
            var @interface = (TInterface)concrete;
            list.Add(@interface);
        }
        return list;
    }

    public override void Write(Utf8JsonWriter writer, List<TInterface> value, JsonSerializerOptions options)
    {
        writer.WriteStartArray();
        foreach (var item in value)
        {
            var concrete = (TConcrete)item;
            JsonSerializer.Serialize(writer, concrete, options);
        }
        writer.WriteEndArray();
    }
}