2013-07-25 18 views
5

Quindi, ecco la mia situazione. Sto implementando una API WEB in un'app WebForms. Ho un sacco di classi dinamiche che sono essenzialmente dizionari che devono usare un formattatore di serializzazione JSON personalizzato per funzionare correttamente (perché il convertitore predefinito mostra semplicemente un casino di abbinamenti Key Value).API Web ASP.NET Custom JsonConverter non viene mai chiamato

Quindi, prima ho creato una consuetudine convertitore 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. 
    } 
} 

Una volta che ho quello definito Ho poi inserirla nel globale JSON tipo di supporto formattatore:

 // 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()); 
     } 

E, infine, la mia prova API (ci saranno molti altri aggiunti in futuro, sto solo provando a testare il sistema per ora, "Contatto" eredita da "Entity"):

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". 
    } 
} 

Quindi, ecco quello che sto vedendo quando il debug: Chiamate

Sito Web "get":

  1. Controller.Get si chiama. Restituisce la lista dei contatti.
  2. Converter.CanConvert viene chiamato per il tipo di enumerazione. Restituisce falso.
  3. Converter.CanConvert viene chiamato per il tipo di contatto. Restituisce vero.
  4. Converter.CanWrite viene chiamato. Restituisce vero.
  5. Viene chiamato Converter.WriteJson. Scrive il JSON corretto nello stream
  6. Il sito Web riceve il JSON corretto ed è in grado di utilizzarlo come oggetto.

Sito Web chiama "update":

  1. Converter.CanConvert è chiamato per il tipo di contatto. Restituisce vero.
  2. Viene chiamato Controller.Update. il parametro "contact" è "null".

Sono assolutamente perplesso. Non capisco perché funzioni durante la serializzazione, ma l'intero processo sembra semplicemente saltare il mio convertitore personalizzato quando si tenta di deserializzare. Qualcuno ha qualche idea su cosa sto facendo male?

Grazie!

risposta

6

Ah geez. Ora mi sento stupido.

... Non stavo inviando JSON nei dati del post. Stavo accidentalmente inviando un guazzabuglio di testo. Whoops ...

Nevermind!

+0

Felice che tu l'abbia capito. Probabilmente dovresti contrassegnare la tua risposta come accettata in modo che la gente sappia che il problema è risolto. –

+1

Ho intenzione di. Stack Overflow non mi lascerà fino a domani però. –

Problemi correlati