2016-06-22 3 views
0

У меня есть строка json, возвращаемая из HttpRequest, которую я пытаюсь десериализовать для объекта. У json есть корневой элемент, который не нужен в моем случае (другие приложения, которые используют одни и те же данные, нуждаются в нем, поэтому его нельзя удалить). Я пробовал несколько разных способов сделать это, но мой объект всегда равен нулю. Я вижу в окне часов, что json возвращается из запроса правильно. Любые идеи относительно того, чего я не хватает?Json.net - десериализация JSON -ignoring корневого элемента?

Мой код ниже.

Вот мой объект, к которому я пытаюсь десериализовать.

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.

{ 
    "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

Название изменится. Он основан на идентификаторе объекта. Я могу сериализовать в объект словаря и получать оттуда мои значения, но это кажется большим количеством накладных расходов для строки json, которая будет содержать только один узел (x_banner) У нас есть общий метод, который мы используем для всех наших других json поэтому я хотел бы иметь возможность повторно использовать его. Пока что я не застрял, я создал новый метод и десериализован в словаре. – Rhonda

ответ

1

Я не вижу никаких причин, чтобы не десериализации к Dictionary<string, BrandHeaderData>, затем установите

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.

 Смежные вопросы

  • Нет связанных вопросов^_^