C# JsonConverter使整个模型为空

C# JsonConverter使整个模型为空,c#,json,serialization,asp.net-web-api,C#,Json,Serialization,Asp.net Web Api,我有一个在webApi中使用的模型。我的模型如下 public class Model: IModel { public string Data1 { get; set; } public string Data2 { get; set; } public int DataInt { get; set; } [JsonConverter(typeof(JsonConcreteTypeConverter<MyObject>))] public

我有一个在webApi中使用的模型。我的模型如下

public class Model: IModel
{
    public string Data1 { get; set; }

    public string Data2 { get; set; }

    public int DataInt { get; set; }
    [JsonConverter(typeof(JsonConcreteTypeConverter<MyObject>))]
    public List<IMyObject> DataObjects { get; set; }    
    }
}
public class JsonConcreteTypeConverter<TConcreteType>: JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

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

    public override bool CanConvert(Type objectType)
    {
        bool result;

        if (objectType == typeof(MyObject))
        {
            result = true;
        }
        else
        {
            result = false;
        }
        return result;
    }
}

我遇到的问题是,当我使用这个jsonConverter时,序列化程序无法反序列化模型,当我调用webApi时,我从Body获得的“action”对象中得到null。如果我删除JsonConverter,我会正确地序列化所有接口,但接口为null,因为序列化程序无法对其进行反序列化。JSON在调用中的格式正确。谢谢

您的
JsonConverter
实现没有按预期工作,因为您的
ReadJson()
正在尝试从
reader
反序列化单个实例,但实际上
reader
位于
ArrayStart
的位置,这意味着转换器应该处理整个数组的反序列化,而不仅仅是单个项。换句话说-
JsonConverter
必须处理修饰成员类型的反序列化

在本例中,您希望将转换器用于数组项。要使其正常工作,需要使用不同的属性-
JsonProperty
,及其属性
ItemConverterType
。结果如下所示:

[JsonProperty(ItemConverterType = typeof(JsonConcreteTypeConverter<MyObject>))]
public List<IMyObject> DataObjects { get; set; }
[JsonProperty(ItemConverterType=typeof(JsonConcreteTypeConverter))]
公共列表数据对象{get;set;}
这将在反序列化项而不是整个数组时正确应用转换器

另外,如果您可以详细说明,如果您的反序列化程序只能处理接口的一个实现,那么在
模型中使用接口有什么意义

如果(objectType==typeof(MyObject))
,您还应该更正此条件,它应该使用
TConcreteType


关于注释-最初我想让
JsonConverter
与列表一起工作,因为我忘记了
JsonProperty.ItemConverterType
,这在您的案例中是正确的方法

如果您不使用提供的类型,那么泛型转换器的意义是什么?@kiziu我更正了代码,粘贴代码是错误的,现在代码与问题中的一样。反序列化正在返回null。您在
CanConvert
中仍有错误,但现在这无关紧要。你的序列化过程有什么不寻常的地方吗?我用
JsonConvert.SerializeObject
序列化了
Model
,它工作得很好(我刚刚创建了一些伪
IMyObject
mybject
)。我现在还可以说,您的
JsonConverter
无法按计划工作-它不适用于集合中的项,但适用于整个集合(标记为属性的属性)。@kiziu序列化工作正常。我的问题是反序列化。序列化程序。反序列化(读取器);它总是返回空值。好吧,您说过序列化也不起作用。我将进一步研究反序列化。我在模型中有接口,因为该接口有多个实现。我正在以迭代的方式开发webApi,第一个实现只支持这种类型。在我接下来的步骤中,它将支持更多类型。谢谢你抽出时间,一切正常
[JsonProperty(ItemConverterType = typeof(JsonConcreteTypeConverter<MyObject>))]
public List<IMyObject> DataObjects { get; set; }