2013-06-23 2 views
1

Я работаю над приложением, которое обращается к TMDb. Я использую класс DataContractJsonSerializer для чтения данных, возвращаемых API TMDb.Чтение JSON с использованием DataContractJsonSerializer

Существует один метод API, который возвращает JSON, который может выглядеть как:

{"id":550,"favorite":false,"rated":false,"watchlist":false} 

или как:

{"id":49521,"favorite":false,"rated":{"value":5.5},"watchlist":false} 

Как вы можете видеть, номинальное поле в первом формате JSON является булевым, а во втором - нет.
Есть ли хороший способ справиться с этими JSON?

Спасибо за любую помощь

Edit: Считывание JSON:

[DataContract] 
public class JsonModelBase<T> where T : class, new() 
{ 
    public T DesterilizeJson(String jsonContent) 
    { 
     var bytes = Encoding.UTF8.GetBytes(jsonContent); 
     using (var stream = new MemoryStream(bytes)) 
      return DesterilizeJson(stream); 
    } 
    public T DesterilizeJson(Stream jsonStream) 
    { 
     var serializer = new DataContractJsonSerializer(typeof(T)); 
     return (T)serializer.ReadObject(jsonStream); 
    } 
} 

[DataContract] 
public class TmdbMovieAccountStates : JsonModelBase<TmdbMovieAccountStates> 
{ 
    [DataMember(Name = "id")] 
    public Int32 Id { get; set; } 
    [DataMember(Name = "favorite")] 
    public Boolean Favorite { get; set; } 
    [DataMember(Name = "rated")] 
    public Boolean Rated { get; set; } 
    [DataMember(Name = "watchlist")] 
    public Boolean Watchlist { get; set; } 
} 

образца (если вы хотите попробовать что-то)

var json = "{\"id\":49521,\"favorite\":false,\"rated\":{\"value\":5.5},\"watchlist\":false}"; 
var bytes = Encoding.UTF8.GetBytes(json); 
using (var stream = new MemoryStream(bytes)) 
{ 
    var serializer = new DataContractJsonSerializer(typeof(TmdbMovieAccountStates)); 
    var data = (TmdbMovieAccountStates)serializer.ReadObject(stream); 
} 
+1

Вы можете попробовать использовать C# динамический тип. Я не стану считать это ответом, потому что я понятия не имею, будет ли это работать. –

+0

Можете ли вы показать свой код, в котором вы задали значение рейтинга? – Stokedout

+0

Добавлен код в вопрос. – musium

ответ

4

При работе с динамическими типами я бы использовал Json.Net вместо DataContractJsonSerializer.

var obj = JsonConvert.DeserializeObject<TmdbMovieAccountStates>(json); 

if (obj.Rated is Boolean) 
    Console.WriteLine(obj.Rated); 
else 
    Console.WriteLine(obj.Rated.value); 


public class TmdbMovieAccountStates 
{ 
    public Int32 Id { get; set; } 
    public Boolean Favorite { get; set; } 
    public dynamic Rated { get; set; } 
    public Boolean Watchlist { get; set; } 
} 

Вам не нужно даже объявить любого класса

dynamic obj = JObject.Parse(json); 

if (obj.rated is bool) 
    Console.WriteLine(obj.rated); 
else 
    Console.WriteLine(obj.rated.value); 
+0

Танки для помощи, я взгляну на Json.Net – musium

1

Попробуйте читателя подход вместо типизированного объекта. Newtonsoft использует динамику, позволяющую вам читать данные и решать, что это такое и что делать с ним, когда вы читаете его. Это очень похоже на, например, XmlReader. Посмотрите здесь http://james.newtonking.com/projects/json/help/

+0

Танки для помощи, я посмотрю Json.Net – musium