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".
}
}
因此,這裏是我所看到的,當我調試:
撥打網站「得到」:
- Controller.Get被調用。返回聯繫人列表。
- Converter.CanConvert被調用爲枚舉類型。返回false。
- 爲Contact類型調用Converter.CanConvert。返回true。
- Converter.CanWrite被調用。返回true。
- Converter.WriteJson被調用。將正確的JSON寫入流
- 網站收到正確的JSON並能夠將其用作對象。
撥打網站 「更新」:
- Converter.CanConvert被稱爲鍵入聯繫人。返回true。
- Controller.Update被調用。 「contact」參數爲「null」。
我完全困惑。我不明白爲什麼在序列化時工作,但整個過程似乎只是試圖反序列化時跳過我的自定義轉換器。任何人有任何想法我做錯了什麼?
謝謝!
很高興你明白了。你應該把你的答案標記爲已接受,這樣大家就知道問題已經解決了。 –
我打算。但是,直到明天堆棧溢出不會讓我。 –