JSON.NET Parser *parece* estar serializando dos veces mis objetos
Mi problema es este:
Esta es la respuesta enviada desde mi controlador WebAPI.
"[
[
{\"id\":\"identifier\"},
{\"name\":\"foobar\"}
]
]"
Observe que la respuesta está entre comillas y todas las comillas incrustadas tienen caracteres de escape. Obviamente esto es un problema. ¿Hay alguna configuración que pueda proporcionar al serializador JSON.NET para evitar que esto ocurra?
Editar
Como pswg adivinó en su respuesta, estaba usando JSON.NET
JsonConvert.SerializeObject(instance)
para realizar mi serialización.
Hice esto porque mientras estaba construyendo mis convertidores personalizados, los había incluido en JsonConvert.DefaultSettings dentro de mi WepApiConfig (y obviamente pensé que esto no sería un problema)
Anteriormente había intentado cambiar el tipo de retorno de mis HttpGets a "mi tipo de objeto" y la respuesta fue una representación json del método ToString() de mi objeto... lo que me hizo saber que la serialización no pasaba a través de mis convertidores.
Cambiar el tipo de retorno de mis HttpGets de cadena a "mi tipo de objeto" y conectar esos convertidores directamente al HttpConfiguration predeterminado de WebAPi funcionó.
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new FooConverter());
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new BarConverter());
Pan comido.
Probablemente tengas algo como esto:
public string GetFoobars()
{
var foobars = ...
return JsonConvert.SerializeObject(foobars);
}
En este caso, está serializando el objeto en una cadena con Json.NET, luego, al devolver el resultado como una cadena, el controlador API serializará la cadena como una cadena literal de JavaScript, lo que hará que la cadena esté entre comillas dobles. y hacer que cualquier otro carácter especial dentro de la cadena se escape con una barra invertida.
La solución es simplemente devolver los objetos por sí mismos:
public IEnumerable<Foobar> GetFoobars()
{
var foobars = ...
return foobars;
}
Esto hará que el controlador API serialice los objetos usando su configuración predeterminada, lo que significa que serializará el resultado como XML o JSON dependiendo de los parámetros pasados desde el cliente.
Otras lecturas
- Serialización JSON y XML en ASP.NET Web API