2009-09-19 3 views
3

저는 JSON을 처음 접했고 API가 제공하는 일부 구문을 분석해야합니다. 빠른 Google 검색은 JSON.NET으로 바뀌 었으므로 이제이 JSON을 구문 분석하여 목록 개체로 사용하려고합니다. 우선, 은 JSON.NET이 최고의 라이브러리는이에요?JSON.NET을 사용하여 일부 JSON을 비 직렬화

이것은 내가하려고하는 것입니다. 예를 들어이라는 클래스가 있습니다. json에는 많은 "요소"(호출되는 경우)가 있으며 각 에는 id라는 정수, name이라는 문자열 및 creationTime이라는 datetime이라는 세 개의 필드이 들어 있습니다. json 의 모든 항목 "요소"를 Item 객체의 목록으로 파싱하고 싶습니다. Item 클래스에 JSON과 일치하는 3 개의 필드를 만들었습니다. 어떻게 JSON.NET을 사용하여이 작업을 수행 할 수 있습니까?

List<Item> fav = (List<Item>)new JsonSerializer().Deserialize(new JsonReader((TextReader)new StreamReader(response.GetResponseStream()))); 

을했지만 작동하지 않는 것 :

나는 시도했습니다. 캐스팅 오류가 발생합니다. 단지 목록 인클로저로 처리 할 수 ​​없지만 JSON을 하나의 Item 클래스로 처리 할 수 ​​있는지 여부는 확실하지 않습니다 (JSON.NET은 문서화가 잘되어 있지 않지만, 내일 심하게 디버깅 할 것입니다.)

JSON.NET으로 구문 분석 할 수있는 방법을 설명하는 샘플 코드를 제공 할 수 있습니까?

감사합니다.

업데이트 : 그건 그렇고, 내 프로젝트는 .NET Framework 2.0을 대상으로하므로 JSON.NET : 1.3.1의 레거시 버전을 사용하고 있습니다. 최소한의 시스템 요구 사항을 손상시키지 않으면 서 프로젝트를 .NET 3.5로 변환할만한 큰 이점이 있습니까?

업데이트 # 2 : 내가 대신 JSON.NET의 System.Web.Extensions.dll에 JavascriptSerializer 클래스를 사용하기로 결정했고, 그것에 대해 질문 here을 게시됩니다. 감사!

+1

"보이지 않습니다. 일 "은 매우 자세하지 않습니다. 무슨 일이야? 그리고 그렇습니다. LINQ는 .NET 3.5의 전반적인 장점이자 JSON.NET의 최신 버전을 사용할 수 있음을 의미합니다. –

+0

@Jon 글쎄 우선, 내가 아는 한, 이것이 내 게시물 중 하나에 답장을 한 것은 처음이므로 감사합니다! 불행히도 LINQ를 모르지만 그것을 배우고 싶습니다! 최신 버전을 사용하려고합니다. 무엇이 작동하지 않는 것은 캐스팅 오류가 발생한다는 것입니다. 캐스팅 오류는 단지 목록 인클로저로 변환 할 수 없습니다. 적어도 JSON.NET은 잘 문서화되지 않았으므로 이것이 의미한다고 생각합니다. 이전에 JSON.NET을 사용한 사람이 있습니까? 그런 경우 어떻게 이러한 문제에 접근 할 수 있는지 설명 할 수 있습니까?감사! ;) –

+0

문제는 이전 버전의 JSON.NET에 대한 도움을 요청하고 있다는 것입니다. 많은 사람들이 최신 버전에만 익숙 할 것입니다. –

답변

1

내가 실현이 질문에 대한 3 세,하지만 난 그냥 당신이 JSON 기반의 API를 구축하려는 경우, NancyFx 굉장 것을 추가 할 거라고 생각 : 참조 http://nancyfx.org/

편집 : 요청한대로 예를 들어, 정말 쉽습니다. 시작하려면 NuGet을 통해 웹 프로젝트에 nancyfx asp 패키지를 추가하십시오. (하위 경로의 기존 앱에 추가하는 경우 web.config에 위치를 추가해야합니다. 그렇지 않으면 가야합니다.)

using Nancy; 
using Nancy.ModelBinding; 

public class Api : NancyModule 
     { 
      public Api() 
      { 
       Get["/api/order/create"] = x => 
       { 
        var order = this.Bind<Order>(); //xml/json negotiated based on content header 

        var result = ... // Do stuff here 

        return Response.AsJson(result); 
       }; 
      }  
     } 
+0

멋진데! 관련 코드 샘플을 링크하거나 게시 할 수 있습니까? 감사. –

+0

감사합니다 - 우아하고 똑바로 보인다. 그러나이 질문은 JSON을 작성하는 대신 JSON을 파싱하는 것과는 다른 주제를 다룹니다. ** Bind ()'이 JSON을'order'로 파싱하도록 요청 했습니까? ** 그렇지 않다면 : 불행히도, 현재 받아 들여지는 대답 또한 질문의 주제와 일치하지 않습니다. 3 년 전에 왜 받아 들였는지 모르겠습니다. . 필자는 내장 된 직렬화 도구 (http://stackoverflow.com/q/1450513/130164)를 사용하여 종료했습니다. ** NancyFx가 JSON **을 구문 분석 할 수 있다면 ** 알고 계시겠습니까? 그렇다면 JSON 입력을 비 직렬화하는 코드 샘플을 귀하의 답변에 추가하여이 질문을 다시 받아 볼 수 있습니까? –

+0

맞습니다 - "this.Bind ()"은 요청의 본문을 가져와 순서대로 직렬화를 해제합니다. 매우 깔끔합니다. Nancy는 JSON.Net을 기본 json 파서로 사용하며 ASP.Net MVC4는 기본적으로 Json.Net을 사용합니다. 대안으로 ServiceStack도 있습니다.하지만 Json.net 자신이 항상 편안했습니다. – Doobi