JSON.NET解析嵌套数据类型

时间:2014-02-17 13:40:38

标签: c# json.net

我是JSON.NET的新手,我一直在玩最近发布的新Marvel API。

当我调用此API时,它将返回以下JSON数据结构: -

{  
    "code": 200,   
    "status": "Ok",   
    "etag": "f0fbae65eb2f8f28bdeea0a29be8749a4e67acb3",   
    "data": 
    {     
        "offset": 0,    
        "limit": 20,     
        "total": 30920,     
        "count": 20,     
        "results": [{array of objects}}]  
    } 
}

我可以像这样为这些数据创建类:

public class Rootobject
{
    public int code { get; set; }
    public string status { get; set; }
    public string etag { get; set; }
    public Data data { get; set; }
}

public class Data
{
    public int offset { get; set; }
    public int limit { get; set; }
    public int total { get; set; }
    public int count { get; set; }
    public Result[] results { get; set; }
}

public class Result
{

}

现在,我的问题。从API返回的结果可以与不同的对象相关,它可以是与角色,漫画,系列等相关的结果。对象都具有不同的属性。

我需要能够根据结果相关的实体类型交换结果类属性吗?

这可以实际完成吗?

2 个答案:

答案 0 :(得分:1)

您可以使用var jObj = JObject.Parse(jsonString)然后通过对象上可用的属性来发现它的对象类型。

jObj["someComicSpecificProperty"] != null

然而,这不是完全证明,需要在每个对象的基础上为结果数组完成。

我看到人们使用的另一种方法是在对象上使用“typeName”属性。

但是,此问题的根本原因是您尝试强类型化非强类型的属性。我真的建议将这些不同类型的结果分成不同的属性,这样你就不会遇到这个问题。

答案 1 :(得分:1)

正如所承诺的,我已经发布了这个问题的anser。事实证明,JSON响应具有覆盖所有相关数据类型的嵌套数据,非常类似于关系数据库。

我发现了一些非常酷的东西,我基本上向API发出请求并将其响应转换为字符串。然后我使用调试器将内容的副本复制到剪贴板。

我创建了一个新类,并将其称为MarvelResponse。

我将NewtonSoft.Json指令添加到文件中,并使用VS2012中“编辑菜单”中的“选择性粘贴”选项。在这里,您可以粘贴选项“粘贴为JSON克拉斯”。

经过一些细微的调整后,它提供的是: -

namespace Kaiser.Training.Data.JSONClasses
{

    public class MarvelResponse
    {
        public int code { get; set; }
        public string status { get; set; }
        public string etag { get; set; }
        public Data data { get; set; }
    }

    public class Data
    {
        public int offset { get; set; }
        public int limit { get; set; }
        public int total { get; set; }
        public int count { get; set; }
        public Result[] results { get; set; }
    }

    public class Result
    {
        public int id { get; set; }
        public string name { get; set; }
        public string description { get; set; }
        public DateTime modified { get; set; }
        public Thumbnail thumbnail { get; set; }
        public string resourceURI { get; set; }
        public Comics comics { get; set; }
        public Series series { get; set; }
        public Stories stories { get; set; }
        public Events events { get; set; }
        public Url[] urls { get; set; }
    }

    public class Thumbnail
    {
        public string path { get; set; }
        public string extension { get; set; }
    }

    public class Comics
    {
        public int available { get; set; }
        public string collectionURI { get; set; }
        public ComicResourceUriItem[] items { get; set; }
        public int returned { get; set; }
    }

    public class ComicResourceUriItem
    {
        public string resourceURI { get; set; }
        public string name { get; set; }
    }

    public class Series
    {
        public int available { get; set; }
        public string collectionURI { get; set; }
        public SeriesResourceItem[] items { get; set; }
        public int returned { get; set; }
    }

    public class SeriesResourceItem
    {
        public string resourceURI { get; set; }
        public string name { get; set; }
    }

    public class Stories
    {
        public int available { get; set; }
        public string collectionURI { get; set; }
        public StoriesResourceItem[] items { get; set; }
        public int returned { get; set; }
    }

    public class StoriesResourceItem
    {
        public string resourceURI { get; set; }
        public string name { get; set; }
        public string type { get; set; }
    }

    public class Events
    {
        public int available { get; set; }
        public string collectionURI { get; set; }
        public EventsResourceUriItem[] items { get; set; }
        public int returned { get; set; }
    }

    public class EventsResourceUriItem
    {
        public string resourceURI { get; set; }
        public string name { get; set; }
    }

    public class Url
    {
        public string type { get; set; }
        public string url { get; set; }
    }

}

这是一个巨大的帮助!希望别人觉得它很有用。