【问题标题】:C# Newtonsoft.Json DeserializeObject if json contains an invalid token [duplicate]C# Newtonsoft.Json DeserializeObject 如果 json 包含无效令牌 [重复]
【发布时间】:2021-06-30 12:30:59
【问题描述】:

如何使用 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"
  }
}

【问题讨论】:

  • 你可以使用Event
  • @phuzi 或 @event - 但我更喜欢副本中的解决方案

标签: c# json.net json-deserialization


【解决方案1】:

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

JsonConvert.DeserializeObject 将返回 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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多