C# 解析json并获取nullexception,而不管我执行了多少次nullchecks
我试图解析一个JSON流,它有时返回一个空包: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"];
{"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;
}