我是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返回的结果可以与不同的对象相关,它可以是与角色,漫画,系列等相关的结果。对象都具有不同的属性。
我需要能够根据结果相关的实体类型交换结果类属性吗?
这可以实际完成吗?
答案 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; }
}
}
这是一个巨大的帮助!希望别人觉得它很有用。