C# Newtonsoft.Json DeserializeObject if json 包含无效标记
C# Newtonsoft.Json DeserializeObject if json contains an invalid token
如何使用 Newtonsoft.Json.JsonConvert.DeserializeObject 在 C# 中反序列化这个 json?
问题是我不能将“事件”用作 class 属性 因为它是一个无效的标记。
{
"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
将 return 类型为 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; }
}
如何使用 Newtonsoft.Json.JsonConvert.DeserializeObject 在 C# 中反序列化这个 json? 问题是我不能将“事件”用作 class 属性 因为它是一个无效的标记。
{
"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
将 return 类型为 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; }
}