C# Json.Deserialize with Object with Child class with interfaces

jus*_*dao 5 c# json

我有一些对象:

public class MyObject
{
    public MyField Field { get; set; }
}

public class MyField
{
    [JsonProperty]
    public Entity MyEntity { get; set; }
    public IEntity IMyEntity { get; set; }
}

public interface IEntity
{
    string MyStr { get; }
}

public class Entity : IEntity
{
}
Run Code Online (Sandbox Code Playgroud)

然后我正在尝试做类似的事情

JsonConvert.DeserializeObject<MyObject>(myObjStr); 
Run Code Online (Sandbox Code Playgroud)

这会引发类似于

无法创建 MyObject 类型的实例...类型是接口或抽象类,无法实例化。路径“MyField.IMyEntity.MyInt”

我无法更改字段或实体,因为它在另一个组的代码库中。MyObject 类是我的。有没有办法反序列化这个对象?我在JSON.NET 中使用 JsonSerializerSettings 尝试了一些方法- 如何反序列化接口实例的集合?但无济于事。

Rob*_*Rob 3

您可以创建自己的 JSON 转换器,它允许您指定类型映射:

public class JsonTypeMapper<TFromType, TToType> : JsonConverter
{
    public override bool CanConvert(Type objectType) => objectType == typeof(TFromType);

    public override object ReadJson(JsonReader reader,
     Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<TToType>(reader);
    }

    public override void WriteJson(JsonWriter writer,
        object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你像这样反序列化:

JsonConvert.DeserializeObject<MyObject>(myObjStr, new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new JsonTypeMapper<IEntity, Entity>() }
                                                            //^^^^^^^, ^^^^^^
}); 
Run Code Online (Sandbox Code Playgroud)