使用DataContractJsonSerializer读取JSON
我正在开发一个访问TMDb的应用程序。 我使用DataContractJsonSerializer类来读取TMDb API返回的数据。
API有一种方法可以返回一个JSON,它看起来像:
{"id":550,"favorite":false,"rated":false,"watchlist":false}
或者喜欢:
{"id":49521,"favorite":false,"rated":{"value":5.5},"watchlist":false}
如您所见,第一个JSON中的额定字段是布尔值,而第二个中的额定字段则不是。
有没有一种很好的方法来处理这个JSON?
谢谢你的帮助
编辑:阅读JSON:
[DataContract] public class JsonModelBase 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 { [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); }
在处理动态类型时,我会使用Json.Net而不是DataContractJsonSerializer。
var obj = JsonConvert.DeserializeObject(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);
尝试使用读者方法而不是键入的对象。 Newtonsoft使用动态来允许您在阅读数据时读取数据并确定它是什么以及如何处理它。 它就像是XmlReader。 看看这里http://james.newtonking.com/projects/json/help/