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 并使用 @eventEvent 指定匿名类型的定义,其中事件出现在 json.访问 属性 时,您需要使用 @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; }
}