2013-07-25 85 views
5

所以這是我的情況。我正在WebForms應用程序中實現WEB API。我有一堆動態類,它們本質上是需要使用自定義JSON序列化格式化程序才能正常工作的字典(因爲默認轉換器只是顯示關鍵值對的混亂)。ASP.NET Web API自定義JsonConverter從不叫

所以首先我創建了一個自定義的JSON轉換器:

/// <summary> 
/// A class to convert entities to JSON 
/// </summary> 
public class EntityJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType.IsSubclassOf(typeof(Entity)); 
    } 

    public override bool CanRead 
    { 
     get { return true; } 
    } 

    public override bool CanWrite 
    { 
     get { return true; } 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     // Details not important. This code is called and works perfectly. 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     // Details not important. This code is *never* called for some reason. 
    } 
} 

一旦我是定義了我,然後將其插入到全球JSON媒體類型格式:

 // Add a custom converter for Entities. 
     foreach (var formatter in GlobalConfiguration.Configuration.Formatters) 
     { 
      var jsonFormatter = formatter as JsonMediaTypeFormatter; 
      if (jsonFormatter == null) 
       continue; 

      jsonFormatter.SerializerSettings.Converters.Add(new EntityJsonConverter()); 
     } 

最後,我測試的API (將來會有更多的新增功能,我現在只想測試系統,「聯繫人」從「實體」繼承):

public class ContactController : ApiController 
{ 
    public IEnumerable<Contact> Get() 
    { 
     // Details not important. Works perfectly. 
    } 

    [HttpPost] 
    public bool Update(Contact contact) 
    { 
     // Details not important. Contact is always "null". 
    } 
} 

因此,這裏是我所看到的,當我調試:

撥打網站「得到」:

  1. Controller.Get被調用。返回聯繫人列表。
  2. Converter.CanConvert被調用爲枚舉類型。返回false。
  3. 爲Contact類型調用Converter.CanConvert。返回true。
  4. Converter.CanWrite被調用。返回true。
  5. Converter.WriteJson被調用。將正確的JSON寫入流
  6. 網站收到正確的JSON並能夠將其用作對象。

撥打網站 「更新」:

  1. Converter.CanConvert被稱爲鍵入聯繫人。返回true。
  2. Controller.Update被調用。 「contact」參數爲「null」。

我完全困惑。我不明白爲什麼在序列化時工作,但整個過程似乎只是試圖反序列化時跳過我的自定義轉換器。任何人有任何想法我做錯了什麼?

謝謝!

回答

6

啊geez。現在我覺得很愚蠢。

...我沒有在發佈數據中發送JSON。我無意中發送了一堆文字。哎呀...

沒關係!

+0

很高興你明白了。你應該把你的答案標記爲已接受,這樣大家就知道問題已經解決了。 –

+1

我打算。但是,直到明天堆棧溢出不會讓我。 –

相關問題