2016-06-22 5 views
0

개체에 deserialize하려고 시도하는 HttpRequest에서 반환되는 json 문자열이 있습니다. json에는 필자의 경우에는 필요하지 않은 루트 요소가 있습니다 (동일한 데이터를 사용하는 다른 응용 프로그램은 필요하지 않으므로 제거 할 수 없습니다). 이 작업을 수행하는 데 여러 가지 방법을 시도했지만 객체는 항상 null입니다. 시계 창에서 json이 요청에서 올바르게 리턴되고 있음을 볼 수 있습니다. 내가 누락 된 것에 대한 어떤 생각?JSON 역 직렬화 - 루트 요소를 무시 하시겠습니까?

내 코드는 다음과 같습니다.

여기에 비 직렬화하려고하는 객체가 있습니다.

public class BrandHeaderResponse 
{ 
    public BrandHeaderData brandHeaderData { get; set; } 
} 

public class BrandHeaderData 
{ 
    public dynamic Image { get; set; } //url and alt text 
    public string BackgroundColor { get; set; } 
    public string LiveText { get; set; } 
} 

여기에 코드

HttpResponseMessage response; 
using (var request = new HttpRequestMessage(HttpMethod.Get, new Uri(url))) 
{ 
    response = await webClient.SendAsync(request, requestHeaders); 
} 
using (var stream = await response.Content.ReadAsStreamAsync()) 
{ 
    using (var sr = new StreamReader(stream)) 
    { 
     using (var reader = new JsonTextReader(sr)) 
     { 
      var serializer = new JsonSerializer(); 
      var data = serializer.Deserialize<T>(reader); 
      return data; 
     } 
    } 
} 

그리고 마지막으로, 여기에 JSON이입니다. 어떤 이유로 당신이 것을 피하고 싶은 경우에 나는 Dictionary<string, BrandHeaderData>에 역 직렬화 할 수없는 어떤 이유가 표시되지 않습니다

{ 
    "2000_banner":{ 
     "ComponentName":"2000_banner", 
     "SchemaName":"Brand Banner", 
     "BrandName":"Rockport - Dummy Banner", 
     "LogoTextColor":"Dark", 
     "Image":{ 
     "ImageUrl":"http://n.media.com/staging/24?w=153&h=64", 
     "AltText":"Burberry" 
     }, 
     "LiveText":"This is dummy brand text for Rockport.", 
     "BackgroundColor":"E3D9CE" 
     } 
    } 
+0

역 직렬화하려는 루트 개체의 속성은 항상 ""2000_banner "'로 지정되거나 속성 이름이 변경 될 수 있습니까? 2) 루트 객체에 다른 속성이있을 수 있습니까? – dbc

+0

이름이 바뀝니다. 그것은 객체의 id를 기반으로합니다. 사전 객체로 직렬화하고 거기에서 값을 가져올 수 있지만 하나의 노드 (x_banner) 만 포함하는 json 문자열에 대한 오버 헤드가 많이 걸릴 수 있습니다. 우리는 다른 모든 json 그래서 나는 그것을 재사용 할 수 있기를 바란다. 당분간, 나는 막혀 있지 않기 때문에 새로운 방법을 만들고 사전에 역 직렬화했다. – Rhonda

답변

1

후,

그러나 오버 헤드를 최소화해야

new BrandHeaderResponse { brandHeaderData = dictionary.Values.SingleOrDefault() }; 

설정 오버 헤드는 JsonTextReader을 통해 이미 읽었으므로 첫 번째 중첩 값을 찾을 때까지 독자를 사용하여 JSON 스트림을 반복하고 다음 확장 메서드를 사용하여 역 직렬화합니다.

public static class JsonExtensions 
{ 
    public static IEnumerable<T> DeserializeValues<T>(Stream stream) 
    { 
     var reader = new StreamReader(stream); // Caller should dispose 
     return DeserializeValues<T>(reader); 
    } 

    public static IEnumerable<T> DeserializeValues<T>(TextReader textReader) 
    { 
     var ser = JsonSerializer.CreateDefault(); 
     var reader = new JsonTextReader(textReader); // Caller should dispose 

     reader.SupportMultipleContent = true; 

     while (reader.Read()) 
     { 
      if (reader.Depth > 0 
       && reader.TokenType != JsonToken.None && reader.TokenType != JsonToken.Undefined && reader.TokenType != JsonToken.PropertyName) 
      { 
       yield return ser.Deserialize<T>(reader); 
      } 
     } 
    } 
} 

그런 다음 DeserializeValues<BrandHeaderData>(stream).SingleOrDefault()을 사용하여 JSON 스트림을 역 직렬화하십시오.