2016-09-29 28 views
0

我有一个模型,我在webApi中使用。我的模型如下。JsonConverter null整个模型

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; }  
    } 
} 

为了反序列化该接口,我创建了我自己的jsonConverter类,如下所示。

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; 
    } 
} 

这是控制器

[HttpPost] 
[Route("api/{ObjectId}/Action")] 
public IHttpActionResult RunAsyncAction([FromBody] Model action) 
{ 
    IModel modelAction = action; 
    //Other code 
    return Content(HttpStatusCode.Accepted, OPERATION_ACCEPTED_MESSAGE); 
} 

说我遇到的问题是,当我使用这个jsonConverter串行无法反序列化模型,当我打电话的WebAPI我得到空内我从FromBody获得的“动作”对象。如果我删除了JsonConverter,我会正确地获得所有序列化,除非接口是null,因为序列化程序无法反序列化它。 Jsons在调用中格式正确。谢谢

+0

如果您不使用所提供的类型,通用转换器的要点是什么? – kiziu

+0

@ kiziu我纠正了代码,现在代码就像是在问题中粘贴代码一样。反序列化返回null – acostela

+0

“CanConvert”中仍然存在错误,但现在无关紧要。序列化过程中有什么不寻常的事情吗?我用'JsonConvert.SerializeObject'序列化'Model',它工作正常(我刚创建了一些虚拟的'IMyObject'和'MyObject')。我现在可以说的是,你的'JsonConverter'不会按照你的计划工作 - 它不适用于集合中的项目,而是整个集合(属性标记为属性)。 – kiziu

回答

1

您实现JsonConverter不能按预期工作,因为你的ReadJson()试图在序列化从reader一个实例,但实际上reader是在ArrayStart的位置,这样就意味着转换器应该处理的反序列化整个阵列,而不仅仅是单个项目。换句话说 - JsonConverter必须处理装饰成员类型的反序列化。

在你的情况下,你希望转换器用于数组项目。为了使其正常工作,您需要使用不同的属性 - JsonProperty及其属性ItemConverterType。结果想要这样:

[JsonProperty(ItemConverterType = typeof(JsonConcreteTypeConverter<MyObject>))] 
public List<IMyObject> DataObjects { get; set; } 

这将正确地应用您的转换器而反序列化一个项目,而不是整个数组。另外,如果你可以详细说明,如果你的反序列化器只能处理它的一个实现,那么在Model有什么界面?

你也应该纠正这种情况if (objectType == typeof(MyObject)) - 它应该使用TConcreteType

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

+0

我有模型中的接口,因为我们有该接口的多个实现。我以迭代方式开发webApi,第一个实现仅支持该类型。在接下来的步骤中,它将支持更多类型。感谢您的时间,它正常工作 – acostela