C# 解析json并获取nullexception,而不管我执行了多少次nullchecks

C# 解析json并获取nullexception,而不管我执行了多少次nullchecks,c#,json,linq,json.net,C#,Json,Linq,Json.net,我试图解析一个JSON流,它有时返回一个空包: {"package":null} 我已经尝试了几乎所有我能找到的方法来检查一个空包,但是我仍然在jObjects上遇到异常,应该可以工作。 这是我的密码 string json = APIRequests.RestClient.makeRequest(uri); JObject jObject = JObject.Parse(json); JToken token = jObject["killID"];

我试图解析一个JSON流,它有时返回一个空包:

{"package":null}
我已经尝试了几乎所有我能找到的方法来检查一个空包,但是我仍然在jObjects上遇到异常,应该可以工作。 这是我的密码

string json = APIRequests.RestClient.makeRequest(uri);
        JObject jObject = JObject.Parse(json);
        JToken token = jObject["killID"];
        try
        {
            if (JsonExtensions.IsNullOrEmpty(token))
            {
                Kill kill = new Kill(
                    true,
                    (int)jObject.SelectToken("package.killmail.killID"),
                    (int)jObject.SelectToken("package.killmail.victim.alliance.id_str"),
                    (string)jObject.SelectToken("package.killmail.victim.alliance.name")
                    );
                return kill;
            }
            else
            {
                Kill nullKill = new Kill(false);
                return nullKill;
            }
        }
        catch(Exception ex)
        {
            Kill nullKill = new Kill(false);
            Console.WriteLine(ex + jObject.ToString());
            return nullKill;

        }
JsonExtensions类:

 public static class JsonExtensions
{
    public static bool IsNullOrEmpty(this JToken token)
    {
        return (token == null) ||
               (token.Type == JTokenType.Array && !token.HasValues) ||
               (token.Type == JTokenType.Object && !token.HasValues) ||
               (token.Type == JTokenType.String && token.ToString() == String.Empty) ||
               (token.Type == JTokenType.Null);
    }
}
当我尝试实例化一个“Kill”对象时会发生异常。 这就是“杀戮”的样子:

 public class Kill
{
    public bool valid;
    public int killid;
    public int allianceid;
    public string alliancename;
    public Kill(bool _valid, int _killid = -1, int _allianceid = -1, string _alliancename = "null")
    {
        valid = _valid;
        killid = _killid;
        allianceid = _allianceid;
        alliancename = _alliancename;
    }
}
这就是错误:

> System.ArgumentNullException: Value cannot be null.
Parameter name: value
   at Newtonsoft.Json.Linq.JToken.EnsureValue(JToken value)
   at Newtonsoft.Json.Linq.JToken.op_Explicit(JToken value)
   at ThiccBott.ObjectParser.ParseKill(String uri) in C:\Users\user\Documents\c#\thiccbott\Utils\ThiccBott.ZkillParser.cs:line 21{
  "package": {
    "killID": 61807875,
    "killmail": {
      "solarSystem": {
        "id_str": "30045306",
        "href": "https://crest-tq.eveonline.com/solarsystems/30045306/",
        "id": 30045306,
        "name": "Hykanima"
      },
      "killID": 61807875,
      "killTime": "2017.04.24 18:39:42",............................

您需要检查
标记是否为空。您的代码缺少

另外,在有效响应的情况下,需要替换
token=jObject[“killID”]带有
token=jObject.SelectToken(“package.killID”)


示例。

您的意思肯定是
如果(!JsonExtensions.IsNullOrEmpty(token))
——请注意,您的代码缺少
。很抱歉回复太晚。失踪的人在写这个问题和尝试更多东西之间是一个错误。代码将进入if语句并对类实例化抛出异常。但是,我认为更改SelectToken jPath语法最终解决了这个问题!非常感谢。
JObject jObject = JObject.Parse(json);
//JToken token = jObject["killID"];
var token = jObject.SelectToken("package.killID");

if (!JsonExtensions.IsNullOrEmpty(token))
{
    Kill kill = new Kill(
        true,
        (int)jObject.SelectToken("package.killmail.killID"),
        (int)jObject.SelectToken("package.killmail.victim.alliance.id_str"),
        (string)jObject.SelectToken("package.killmail.victim.alliance.name")
        );
    return kill;
}
else
{
    Kill nullKill = new Kill(false);
    return nullKill;
}