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().Is​Subclass​Of(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进行填充。有关详细信息,请参见例如来源。