2012-04-20 7 views
6

Zaczynam się uczyć Json.NET, ale mam problem z używaniem serializera. Mam nowy projekt MVC4 z usługą Web.API:Używanie serializatora Json.NET w projekcie 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() działa zgodnie z oczekiwaniami i zwraca ciąg znaków. Mój kontroler Web.API zwraca to jako część HttpResponseMessage. Wynik końcowy, patrząc w Skrzypek, nie ma danych JSON, ale dane JSON jest ponownie w odcinkach (chyba):

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

Czy ktoś wie jak wyłączyć domyślne serializatora tak mogę używać Json.NET bezpośrednio ? Nawiasem mówiąc, nie używam domyślnego serializera, ponieważ nie mogę wymyślić, jak sprawić, by działał on z obiektami złożonymi (PTE_Test ostatecznie będzie zawierał elementy typu List).

Ewentualnie rozwiąże to również mój problem, jeśli ktoś może wyjaśnić, jak używać domyślnego serializera dla złożonych obiektów. Wyjaśnienie MSDN nie pomogło mi.

Odpowiedz

5

Rick Strahl ma bloga pod tym numerem here z działającym kodem.

+0

Jego wskazówka na temat używania obiektu JsonValue była dokładnie tym, czego potrzebowałem. Dzięki! – CraigB

+0

Szybki follow-up: JsonValue pracował dla mnie tylko w Get, ale nie w Put, Post, itd. Więc dodałem format Jick.NET Rick'a i jak na razie działa całkiem nieźle. – CraigB

2

Jak podkreślali inni, należy utworzyć formatator i zamienić DataContractSerializer serializatorem JSON.NET. Chociaż, jeśli nie spieszysz się specjalnie do JSON.NET, plotka głosi, że następna wersja beta/rc będzie obsługiwać wbudowany JSON.NET.

Pojęciowo jednak brakuje Ci części magia WebAPI. Z WebAPI zwracasz swój obiekt w swoim stanie natywnym (lub IQueryable, jeśli potrzebujesz obsługi OData). Po zakończeniu wywołania funkcji następuje przejęcie programu Formatter i przekonwertowanie go na właściwy kształt w zależności od żądania klienta.

W oryginalnym kodzie przekonwertowałeś PTE_Test na ciąg JSON i zwróciłeś go, w którym to momencie JSON Formatter rozpoczął kopiowanie i serializował ciąg znaków. I zmodyfikowany kod w następujący sposób:

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); 
     } 
    } 
    } 

Wskazówki w jaki sposób zwraca PTE_Test zamiast string. Zakładając, że żądanie przychodzi z nagłówkiem żądania Accept = application/json, wówczas zostanie wywołany formater JSON. Jeśli żądanie ma nagłówek: Accept = text/xml, wywoływacz formatu XML jest wywoływany.

Istnieje niezły artykuł na temat here. Jeśli jesteś wzrokowcem, Scott Gu pokazuje kilka przykładów użycia skrzypka w this video, starting around 37 minutes. Pedro Reys zagłębia się nieco głębiej w content negotiation here.

+0

Dzięki za szczegółową odpowiedź. Rozumiem koncepcyjnie, dlaczego byłoby miło mieć własny formatter. Widzę też teraz, dlaczego może to być przydatne w naszym projekcie.Nie jestem pewien, jak dodać go do mojego kodu, ale obejrzę film ScottGu i przejdę dalej, jeśli będę miał więcej pytań. – CraigB

+0

Należy zauważyć, że jeśli można uzyskać z obecnym serlializatorem JSON, w następnym wydaniu JSON.NET będzie jednym z wbudowanym serializera. – EBarr

Powiązane problemy