使用DataContractJsonSerializer读取JSON

时间:2013-06-23 16:51:26

标签: c# .net 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?

感谢您的帮助

修改 阅读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);
}

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

尝试使用读者方法而不是键入的对象。 Newtonsoft使用动态来允许您在阅读时读取数据并确定它是什么以及如何处理它。它很像例如的XmlReader。看看http://james.newtonking.com/projects/json/help/