我有一些对象:
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 尝试了一些方法- 如何反序列化接口实例的集合?但无济于事。
您可以创建自己的 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)