2016-09-10 6 views
-2

이것은 내 질문 HTTPClient Buffer Exceeded 2G; Cannot write more bytes to the buffer과 관련이 있지만 IMO가 별도의 질문을하기에 충분할만큼 다릅니다.NewtonSoft Json 잘못된 캐스트 예외

다른 질문으로 2G 요청 버퍼를 처리하는 방법을 알아 내려고합니다. 아이디어는 스트리밍을 사용하는 것이지만 비 직렬화해야합니다. Google 교수와 이야기하면서, 나는 스트림/비 직렬화에 TextReader를 사용해야한다는 것을 알게되었습니다. 그래서 내 코드는 다음과 같습니다.

public async Task<API_Json_Special_Feeds.RootObject> walMart_Special_Feed_Lookup(string url) 
    { 
     special_Feed_Lookup_Working = true; 
     HttpClientHandler handler = new HttpClientHandler() 
     { 
      AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate 
     }; 
     using (HttpClient http = new HttpClient(handler)) 
     { 

      http.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("gzip")); 
      http.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite); 
      url = String.Format(url); 
      using (var response = await http.GetAsync(url, HttpCompletionOption.ResponseHeadersRead)) 
      { 
       Console.WriteLine(response); 
       var serializer = new JsonSerializer(); 

       using (StreamReader sr = new StreamReader(await response.Content.ReadAsStreamAsync())) 
       { 
        using (var jsonTextReader = new JsonTextReader(sr)) 
        { 
         API_Json_Special_Feeds.RootObject root = (API_Json_Special_Feeds.RootObject)serializer.Deserialize(jsonTextReader); 
         return root; 
        } 
       } 
      } 
     } 
    } 

자, 보시다시피, 강하게 입력됩니다. 메서드의 반환 유형이 일치합니다. 지금, 나는 호출 라인으로 이동 :

API_Json_Special_Feeds.RootObject Items = await net.walMart_Special_Feed_Lookup(specialFeedsURLs[i].Replace("{apiKey}", Properties.Resources.API_Key_Walmart)); 

그래서, 우리가 일치 한 종류의 주위에 모든 방법을 API_Json_Special_Feeds.RootMethod.

원하지 않는 결과 :

실행

는, 호출 라인은 InvalidCastException이를 던졌습니다

Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'RootObject' 

내가 반환하기 전에 방법의 끝에서 확인했습니다, 그 결과가 참에서 캐스팅 반환되기 전에 API_Json_Special_Feeds.RootMethod의 객체.

질문

: 어딘가에 return 문 및 호출 라인 사이는, 반환되는 객체는 Newtonsoft.Json.Linq.JObject에 API_Json_Special_Feeds.RootMethod 변환되고있다. 그 사이에 코드가 없으므로 디버깅 할 수 없습니다. 전화 회선에서 다시 전송하면 '전송할 수 없음'오류가 발생합니다. 이 개체 유형의 저하/변경을 어떻게 막을 수 있습니까?

많은 사람들이 시간, 배려 및 생각이나 제안에 대해 생각합니다.

답변

1

당신은 수신 시스템이 예상 유형을 지정하는 것이 필요 그래서, JSON 파일은 일반적으로 C#을 유형 정보를 포함하지 않는 BinaryFormatter에 의해 생성 된 파일과는 달리 일반 과부하를 JsonSerializer.Deserialize<T>()

var root = serializer.Deserialize<API_Json_Special_Feeds.RootObject>(jsonTextReader); 

를 사용해야합니다.

(이 C#을 유형 정보에 JSON 파일에 포함 할 수있는 JSON standard의 확장이있다 - 예를 들면 Json.NET의 TypeNameHandling -.하지만 적절한 명시 적 기본 클래스에 JSON을 역 직렬화하는 것은 여전히 ​​필요합니다)

스트림에서 강력한 형식의 C# 개체를 deserialize하는 다른 예제는 Deserialize JSON from a file을 참조하십시오.

+0

고마워요! 지금까지는 작동하지 않습니다. 내가 갇혀있는 곳을 알아 내려고하고보고 할 것입니다. 오류 없음 - 응답을로드하고 아무 것도 반환하지 않음 –