使用 Newtonsoft 有几种方法可以做到这一点。
JsonConvert.DeserializeObject 将返回 JObject 类型的对象,这可以通过不指定类型(反序列化后进行强制转换)或指定 JObject 类型来完成。
从这里您可以访问事件,因为它只是一个键名,但是您会丢失任何强类型的 json。
var jobj = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(json);
var _event = jobj["resultsPage"]["results"]["event"];
更进一步,您可以使用JsonConvert.DeserializeAnonymousType 并指定匿名类型的定义,使用@event 或Event,其中json 中存在事件。访问该属性时,您需要使用@event 或Event,具体取决于您选择的方式,您可以获得强类型对象的好处。
var jobj = Newtonsoft.Json.JsonConvert.DeserializeAnonymousType(json, new {
resultsPage = new {
results = new {
@event = new {
location = new {
city = "",
lng = 0.0,
lat = 0.0
},
uri = "",
displayName = "",
id = 0,
type = "",
start = new {
time = "",
date = "",
datetime = new DateTime()
},
status = ""
}
},
status = ""
}
});
var _event = jobj.resultsPage.results.@event;
接下来,您可以使用此匿名对象定义创建类并将其拆分为类,再次使用@event 或Event,它将反序列化。
var jobj = Newtonsoft.Json.JsonConvert.DeserializeObject<JsonClass>(json);
var _event = jobj.resultsPage.results.@event;
public class JsonClass
{
public ResultsPage resultsPage { get; set; }
public string status { get; set; }
}
public class ResultsPage
{
public Results results { get; set; }
public string status { get; set; }
}
public class Results
{
public Event @event { get; set; }
}
public class Event
{
public Location location { get; set; }
...
}
public class Location
{
public string city { get; set; }
}
或者您可以查看使用属性属性将完全不同的属性名称映射到 json 键(以下是上述内容的修改摘录)。
public class Results
{
[JsonProperty(PropertyName = "event")]
public EventResult EventResult { get; set; }
}
public class EventResult
{
public Location location { get; set; }
}