2012-09-29 39 views
7

Imagine una acción de controlador simple IEnumerable<BaseType> Get(). Devuelve una enumeración de diferentes tipos, todos derivados de BaseType.Herencia y el formateador JSON de ASP.NET Web API

Cuando el cliente solicita XML, el resultado es algo como esto:

<ArrayOfBaseType> 
    <BaseType i:type="DerivedType1"><A>value</A></BaseType> 
    <BaseType i:type="DerivedType2"><B>value</B></BaseType> 
    <BaseType i:type="DerivedType3"><C>value</C></BaseType> 
</ArrayOfBaseType> 

Como se puede ver, el tipo de la clase derivada se transmite en el atributo i:type.

Si el cliente solicita JSON sin embargo, esta información no se encuentra:

[ 
    {"A":"value"}, 
    {"B":"value"}, 
    {"C":"value"} 
] 

cómo solucionar este problema?

+3

@downvoter: Sin una explicación, su voto no vale nada ya que no puedo mejorar la pregunta sin saber lo que no está claro. –

Respuesta

4

El siguiente cambio es necesario:

En los WebApiConfig.cs la siguiente línea necesita ser añadido :

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = 
    TypeNameHandling.Auto; 

Esto dará automáticamente como resultado una nueva propiedad $type cuando sea necesario.

0

Si escribe su clase siguiente:

public class MyClass 
{ 
    // properties here 

    public string IType 
    { 
     get 
     { 
      return this.GetType().Name; 
     } 

     set { } 
    } 
} 

Tal vez, que le ayudará a

+0

No realmente. En mi opinión eso es un truco. –

+0

No estoy seguro si json existe de otra manera. – Khurshid