3

I have a Web API that returns a list of objects, when the client passes Accept application/json I want my globally registered json formatter to include TypeNameHandling for the derived types during serialization. However this doesn't work and I can't see why this shouldn't work ?

My objects

public class BaseClass 
{
    public int Id { get; set; }
}

public class SubClass : BaseClass
{
    public string SubClassProp { get; set; }
}

public class SubClassA : SubClass
{
    public string SubClassAProp { get; set; }
}

public class SubClassB : SubClass
{
   public string SubClassBProp { get; set; }
}

WebApiConfig

public static void Register(HttpConfiguration config) 
{
   var formatters = GlobalConfiguration.Configuration.Formatters;
   var jsonFormatter = formatters.JsonFormatter;
   var settings = jsonFormatter.SerializerSettings;
   settings.Formatting = Formatting.Indented;
   settings.NullValueHandling = NullValueHandling.Ignore;
   settings.TypeNameHandling = TypeNameHandling.Auto;
}

Web API Controller

public class MyController : ApiController
{
    [HttpGet]
    public async Task<IList<BaseClass>> GetClasses() 
    {
       return new List<BaseClass>
              {
                 new SubClassA 
                 { 
                    Id = 1, 
                    SubClassProp = "SubClass", 
                    SubClassAProp = "SubClassAProp"
                 },
                 new SubClassB
                 {
                    Id = 2, 
                    SubClassProp = "SubClass", 
                    SubClassBProp = "SubClassBProp"
                 }
              };
    }
}

Call from API Client in same solution

var client = new HttpClient() { BaseAddress = new Uri("uri goes here...")}
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var resp = await client.GetAsync("uri goes here..."));
var jsonContent = await resp.Content.ReadAsStringAsync();

var ListOfClasses = JsonConvert.DeserializeObject<IList<BaseClass>>(jsonContent, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });

I'am expecting to get one element which is SubClassA and one that is SubClassB, but both is BaseClass ?

I also want it to be possible to Deserialize json to object in Post method.

And this should be possible for both json and xml

Henrik
  • 1,797
  • 4
  • 22
  • 46

0 Answers0