2012-04-20 10 views
6

Estoy empezando a aprender Json.NET, pero tengo problemas para usar su serializador. Tengo un nuevo proyecto MVC4 con un servicio Web.API:Uso del serializador Json.NET en un proyecto MVC4

public class PTE_TestsController : ApiController { 

    PTE_TestsRepository _repository = new PTE_TestsRepository(); 

    // GET /api/PTE_Tests/5 
    public HttpResponseMessage<string> Get(int id) { 
    try { 
     PTE_Test test = _repository.GetTest(id); 
     return new HttpResponseMessage<string>(JsonConvert.SerializeObject(test)); 
    } catch { 
     return new HttpResponseMessage<string>(HttpStatusCode.NotFound); 
    } 
    } 
} 

JsonConvert.SerializeObject() funciona como se espera y devuelve una cadena. Mi controlador Web.API lo devuelve como parte de un HttpResponseMessage. El resultado final, cuando se ve en Fiddler, no es de datos JSON, pero los datos JSON por entregas de nuevo (creo):

"{\"ID\":1,\"Name\":\"Talar Tilt\",\"TagID\":1,\"PracticeID\":1, 
    \"SpecificAreaID\":1,\"TypeID\":1,\"VideoID\":1,\"PicID\":1}" 

¿Alguien sabe cómo apagar el serializador predeterminado para que pueda utilizar directamente Json.NET ? Por cierto, no estoy usando el serializador predeterminado porque no puedo encontrar la manera de hacerlo funcionar con objetos complejos (PTE_Test eventualmente contendrá los miembros del tipo List).

Alternativamente, también resolverá mi problema si alguien puede explicar cómo usar el serializador predeterminado con objetos complejos. La explicación de MSDN no me ayudó.

Respuesta

5

Rick Strahl tiene un blog en ese here con un código que funciona.

+0

Su consejo sobre el uso de un objeto JsonValue era exactamente lo que necesitaba. ¡Gracias! – CraigB

+0

Seguimiento rápido: JsonValue solo funcionó para mí en Get, pero no en Put, Post, etc. Así que agregué el formateador Json.NET de Rick y hasta ahora funciona bastante bien. – CraigB

2

Como han señalado otros, debe crear un formateador y reemplazar el DataContractSerializer con el serializador JSON.NET. Aunque, si no estás apurado por JSON.NET específicamente, corre el rumor de que la próxima versión de beta/rc tendrá soporte para JSON.NET incorporado.

Conceptualmente, sin embargo, te estás perdiendo parte de la magia de WebAPI. Con WebAPI puede devolver su objeto en su estado nativo (o IQueryable si desea soporte de OData). Después de la llamada a la función finaliza el control del formateador y lo convierte en la forma adecuada en función de la solicitud del cliente.

Por lo tanto, en su código original, convirtió PTE_Test en una cadena JSON y la devolvió, momento en el que el formateador JSON inició y serializó la cadena. He modificado el código de la siguiente manera:

public class PTE_TestsController : ApiController { 
    PTE_TestsRepository _repository = new PTE_TestsRepository(); 

    public HttpResponseMessage<PTE_Test> Get(int id) { 
     try { 
      PTE_Test test = _repository.GetTest(id); 
      return new HttpResponseMessage(test); 
     } catch { 
      return new HttpResponseMessage<string>(HttpStatusCode.NotFound); 
     } 
    } 
    } 

Aviso cómo su función devuelve PTE_Test en lugar de string. Suponiendo que la solicitud entró con un encabezado de solicitud de Accept = application/json, se invocará el formateador JSON. Si la solicitud tenía un encabezado de: Accept = text/xml, se invoca el formateador XML.

Hay un artículo decente sobre el tema here. Si eres un aprendiz visual, Scott Gu muestra algunos ejemplos usando el violín en this video, starting around 37 minutes. Pedro Reys profundiza un poco más en content negotiation here.

+0

Gracias por la respuesta detallada. Entiendo conceptualmente por qué sería bueno tener mi propio formateador. También veo ahora por qué podría ser útil en nuestro proyecto.No estoy seguro de cómo agregarlo a mi código, pero veré el video de ScottGu y le haré un seguimiento aquí si tengo más preguntas. – CraigB

+0

Tenga en cuenta que si puede salir adelante con el serializador JSON actual, en la próxima versión, JSON.NET será uno de los integrados en el serializador. – EBarr

Cuestiones relacionadas