2016-09-29 50 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