C#Newtonsoft.Json DeserializeObject,如果Json包含无效令牌



如何使用Newtonsoft.json.JsonConvert.DeserializeObject在C#中反序列化此json?问题是我不能使用";事件";作为类属性,因为它是无效的令牌。

{
"resultsPage": {
"results": {
"event": {
"location": {
"city": "London, UK",
"lng": -0.1150322,
"lat": 51.4650846
},
"uri": "http://www.....",
"displayName": "Test",
"id": 3037536,
"type": "Testtype",
"start": {
"time": "19:30:00",
"date": "2010-02-16",
"datetime": "2010-02-16T19:30:00+0000"
},
"status": "ok"
}
},
"status": "ok"
}
}

使用Newtonsoft有几种方法可以做到这一点。

JsonConvert.DeserializeObject将返回类型为JObject的对象,这可以通过不指定类型(而是在反序列化后强制转换(或指定JObject类型来实现。

从这里您可以访问事件,因为它只是一个密钥名称,但您会丢失json的任何强类型。

var jobj = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(json);    
var _event = jobj["resultsPage"]["results"]["event"];

更进一步,您可以使用JsonConvert.DeserializeAnonymousType并使用事件出现在json中的@eventEvent指定匿名类型的定义。访问属性时,您需要使用@eventEvent,具体取决于您选择的类型,这样您就可以获得强类型对象的好处。

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;

接下来,您可以使用这个匿名对象定义创建类,并将其拆分为类,再次使用@eventEvent,它将反序列化。

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; }
}

最新更新