2012-04-20 2 views
6

Json.NET을 배우기 시작했는데, 시리얼 라이저 사용에 문제가 있습니다.MVC4 프로젝트에서 Json.NET 시리얼 라이저 사용하기

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() 예상 문자열을 반환로 작동 : 나는 Web.API 서비스로 새로운 MVC4 프로젝트가 있습니다. 내 Web.API 컨트롤러는 HttpResponseMessage의 일부로이를 반환합니다. 피들러에서 볼 때 최종 결과는, JSON 데이터가 아니라 JSON 데이터는 (내가 생각하는) 다시 직렬화 :

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

누군가가 내가 Json.NET을 직접 사용할 수있는 기본 시리얼을 해제하는 방법을 알고 있나요 ? 그건 그렇고, 필자는 복잡한 객체 (PTE_Test는 결국 List 유형의 멤버를 포함 할 것입니다)에서 작동하도록 만드는 방법을 이해할 수 없기 때문에 기본 시리얼 라이저를 사용하지 않습니다.

누군가가 복잡한 개체와 함께 기본 직렬기를 사용하는 방법을 설명 할 수 있으면 내 문제도 해결됩니다. MSDN의 설명이 도움이되지 못했습니다.

답변

5

릭 스트 렐 (Rick Strahl)은 그 블로그에 here 코드가 있으며 작동합니다.

+0

JsonValue 객체 사용에 대한 그의 조언은 내가 필요로하는 것이었다. 감사! – CraigB

+0

빠른 후속 조치 : JsonValue는 Get, Put은 아니지만 Post 등에서 만 작동했습니다. 그래서 Rick의 Json.NET 포맷터를 추가했으며 지금까지 꽤 잘 작동했습니다. – CraigB

2

다른 사람들도 지적했듯이, 포맷터를 만들고 DataContractSerializerJSON.NET 시리얼 라이저로 바꿔야합니다. 특별히 JSON.NET을 서두르지 않으면 다음 beta/rc가 JSON.NET을 지원할 것이라는 소문이 있습니다.

그러나 개념적으로 WebAPI의 마법. WebAPI를 사용하면 네이티브 상태 (또는 OData 지원을 원할 경우 IQueryable)로 객체를 반환 할 수 있습니다. 함수 호출이 끝나면 Formatter가 인계 받아 클라이언트 요청에 따라 적절한 모양으로 변환합니다.

원래 코드에서 PTE_Test을 JSON 문자열로 변환하고 반환했습니다. 그 시점에서 JSON Formatter가 실행되어 문자열을 직렬화했습니다.

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

주의 함수는 PTE_Test 대신 string 반환하는 방법을 다음과 같이 나는 당신의 코드를 수정했습니다. 요청 헤더가 Accept = application/json 인 것으로 가정하면 JSON 포맷터가 호출됩니다. 요청의 헤더가 Accept = text/xml 인 경우 XML 형식 기가 호출됩니다.

here에 관한 기사가 있습니다. 시각적 인 학습자 인 경우 Scott Gu는 this video, starting around 37 minutes에 피들을 사용하는 몇 가지 예를 보여줍니다. Pedro Reys는 content negotiation here을 좀 더 깊이 파고 들었습니다.

+0

자세한 답변을 보내 주셔서 감사합니다. 나는 왜 내 자신의 포맷터를 갖는 것이 좋을지 개념적으로 이해한다. 나는 또한 그것이 왜 우리 프로젝트에서 유용 할 수 있는지를 보았다.코드에 코드를 추가하는 방법을 모르겠지만 ScottGu 비디오를보고 다른 질문이 있으면 여기로 따라갑니다. – CraigB

+0

참고로, 현재 JSON 직렬 처리기를 사용하여 얻을 수있는 경우 다음 릴리스에서 JSON.NET은 내장 직렬 변환기 중 하나가 될 것입니다. – EBarr

관련 문제