JSON.NET Parser *parece* estar serializando dos veces mis objetos

Resuelto K. Alan Bates asked hace 10 años • 3 respuestas

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.

K. Alan Bates avatar Aug 29 '14 05:08 K. Alan Bates
Aceptado

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
p.s.w.g avatar Aug 28 '2014 22:08 p.s.w.g