Json.Net:在填充接口属性时指定对象类型
我有一个对象,它使用另一个接口的属性实现一个接口:Json.Net:在填充接口属性时指定对象类型,json,json.net,Json,Json.net,我有一个对象,它使用另一个接口的属性实现一个接口: public interface IMaster { ISlave ObjectProp {get; set; } } public interface ISlave { string Name {get; set; } } ... public class Master : IMaster { public ISlave ObjectProp {get; set; } } public class Slave : ISl
public interface IMaster
{
ISlave ObjectProp {get; set; }
}
public interface ISlave
{
string Name {get; set; }
}
...
public class Master : IMaster
{
public ISlave ObjectProp {get; set; }
}
public class Slave : ISlave
{
public string Name {get; set; }
}
我可以创建Master类的一个实例,并使用JsonConvert.PopulateObject对其进行反序列化。
然而,当反序列化属性时,解析器显然无法创建接口的实例
有没有一种方法可以通过属性、回调等告诉Json库,以创建实现相关接口的从属类的实例?是的,这看起来像是重复的-JsonConverterAttribute似乎工作正常。为完整起见,以下是解决方案:
...
public class Master : IMaster
{
[JsonConverter(typeof(ModelJsonConverter), typeof(Slave))]
public ISlave ObjectProp {get; set; }
}
...
public class ModelJsonConverter : JsonConverter
{
public Type InstanceType { get; set; }
public ModelJsonConverter(Type instanceType):base()
{
InstanceType = instanceType;
}
public override bool CanWrite => false;
public override bool CanRead => true;
public override bool CanConvert(Type objectType)
{
if (objectType == InstanceType) return true;
else return InstanceType.GetTypeInfo().IsSubclassOf(objectType);
}
public override void WriteJson(JsonWriter writer,
object value, JsonSerializer serializer)
{
throw new InvalidOperationException("Use default serialization.");
}
public override object ReadJson(JsonReader reader,
Type objectType, object existingValue,
JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
else if (reader.TokenType != JsonToken.StartObject) throw new JsonException($"Unexpected Json token at {reader.Path}: {reader.TokenType.ToString()}");
var deserialized = Activator.CreateInstance(InstanceType);
serializer.Populate(reader, deserialized);
return deserialized;
}
}
或的可能副本。如果您在反序列化接口[Json.Net]上搜索,还有许多其他类似的问题。其他可能的重复问题:尤其是那些看起来能够准确且准确地回答您的问题的问题。由于类型不是多态的,您实际上不需要预加载到JObject中。您可以直接从传入的JsonReader进行填充。有关详细信息,请参见例如来源。