C#如何处理空json值?Getting and InvalidOperationException:无法访问上的子值>;Newtonsoft.Json.Linq.JValue
我在处理json文件中的空值时遇到问题。如下图所示,空值位于player下: 不幸的是,这导致以下InvalidOperation异常: System.InvalidOperationException:无法访问上的子值 Newtonsoft.Json.Linq.JValue。 位于Newtonsoft.Json.Linq.JToken.get_项(对象键) 在WindowsFormsApplication2中,在C:\Users\Administrator\documents\visual studio中启动\u Lineups.StartingLineups() 2015\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Starting 第97行 我尝试了以下方法,但没有成功 JSON:C#如何处理空json值?Getting and InvalidOperationException:无法访问上的子值>;Newtonsoft.Json.Linq.JValue,c#,json,C#,Json,我在处理json文件中的空值时遇到问题。如下图所示,空值位于player下: 不幸的是,这导致以下InvalidOperation异常: System.InvalidOperationException:无法访问上的子值 Newtonsoft.Json.Linq.JValue。 位于Newtonsoft.Json.Linq.JToken.get_项(对象键) 在WindowsFormsApplication2中,在C:\Users\Administrator\documents\visual
{"gamestartinglineup":{"lastUpdatedOn":"2017-10-24 11:41:12 AM","game":{"id":"42120","date":"2017-10-24","time":"7:30PM","awayTeam":{"ID":"83","City":"New York","Name":"Knicks","Abbreviation":"NYK"},"homeTeam":{"ID":"82","City":"Boston","Name":"Celtics","Abbreviation":"BOS"},"location":"TD Garden"},"teamLineup":[{"team":{"ID":"83","City":"New York","Name":"Knicks","Abbreviation":"NYK"},"expected":{"starter":[{"position":"Bench8","player":null},{"position":"Starter1","player":{"ID":"9087","LastName":"Hardaway Jr.","FirstName":"Tim","JerseyNumber":"3","Position":"SG"}},{"position":"Starter2","player":{"ID":"9373","LastName":"Porzingis","FirstName":"Kristaps","JerseyNumber":"6","Position":"PF"}},{"position":"Starter5","player":{"ID":"9518","LastName":"Sessions","FirstName":"Ramon","JerseyNumber":"1","Position":"PG"}},{"position":"Starter3","player":{"ID":"9396","LastName":"Kanter","FirstName":"Enes","JerseyNumber":"0","Position":"C"}},{"position":"Starter4","player":{"ID":"9127","LastName":"Lee","FirstName":"Courtney","JerseyNumber":"1","Position":"SG"}},{"position":"Bench1","player":{"ID":"9148","LastName":"McDermott","FirstName":"Doug","JerseyNumber":"20","Position":"SF"}},{"position":"Bench2","player":{"ID":"9376","LastName":"O'Quinn","FirstName":"Kyle","JerseyNumber":"9","Position":"PF"}},{"position":"Bench3","player":{"ID":"9245","LastName":"Beasley","FirstName":"Michael","JerseyNumber":"9","Position":"F"}},{"position":"Bench4","player":{"ID":"10102","LastName":"Baker","FirstName":"Ron","JerseyNumber":"31","Position":"G"}},{"position":"Bench5","player":null},{"position":"Bench6","player":null},{"position":"Bench7","player":null}]},"actual":null},{"team":{"ID":"82","City":"Boston","Name":"Celtics","Abbreviation":"BOS"},"expected":{"starter":[{"position":"Bench8","player":null},{"position":"Starter1","player":{"ID":"13730","LastName":"Tatum","FirstName":"Jayson","JerseyNumber":"0","Position":"F"}},{"position":"Starter2","player":{"ID":"9082","LastName":"Horford","FirstName":"Al","JerseyNumber":"15","Position":"C"}},{"position":"Starter5","player":{"ID":"9157","LastName":"Irving","FirstName":"Kyrie","JerseyNumber":"11","Position":"PG"}},{"position":"Starter3","player":{"ID":"9211","LastName":"Baynes","FirstName":"Aron","JerseyNumber":"12","Position":"C"}},{"position":"Starter4","player":{"ID":"10090","LastName":"Brown","FirstName":"Jaylen","JerseyNumber":"7","Position":"SF"}},{"position":"Bench1","player":{"ID":"13777","LastName":"Theis","FirstName":"Daniel","JerseyNumber":"27","Position":"PF"}},{"position":"Bench2","player":{"ID":"9105","LastName":"Rozier","FirstName":"Terry","JerseyNumber":"12","Position":"PG"}},{"position":"Bench3","player":{"ID":"13770","LastName":"Nader","FirstName":"Abdel","JerseyNumber":"28","Position":"SF"}},{"position":"Bench4","player":{"ID":"9120","LastName":"Larkin","FirstName":"Shane","JerseyNumber":"8","Position":"PG"}},{"position":"Bench5","player":{"ID":"13778","LastName":"Yabusele","FirstName":"Guerschon","JerseyNumber":"30","Position":"PF"}},{"position":"Bench6","player":{"ID":"13771","LastName":"Bird","FirstName":"Jabari","JerseyNumber":"26","Position":"SG"}},{"position":"Bench7","player":null}]},"actual":null}]}}
代码:
public void StartingLineups()
{
upass.upass up = new upass.upass();
string address3 = "https://api.mysportsfeeds.com/v1.1/pull/nba/2017-2018-regular/game_startinglineup.json?gameid=" + dateTimePicker1.Text + comboBox2.Text;
var w3 = new WebClient();
w3.UseDefaultCredentials = true;
w3.Credentials = new NetworkCredential(up.username, up.password);
var result3 = w3.DownloadString(address3);
var obj3 = JObject.Parse(result3);
StartingLineup.startinglineup sl = new StartingLineup.startinglineup();
try
{
foreach (JToken child in obj3 ["gamestartinglineup"]["teamLineup"])
{
foreach (JToken sub in child["expected"]["starter"])
{
JsonConvert.SerializeObject(sub,
Newtonsoft.Json.Formatting.None,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
sl.player = sub["player"]["FirstName"].ToString() + " " + sub["player"]["LastName"].ToString();
sl.team = child["team"]["City"].ToString() + " " + child["team"]["Name"].ToString();
sl.position = sub["position"].ToString();
sl.playerpositon = sub["player"]["Position"].ToString();
DataRow row = dt.NewRow();
row["Team"] = sl.team;
row["Player"] = sl.player;
row["Position"] = sl.playerpositon;
if (sl.position.Contains("Starter"))
{
row["Role"] = sl.position;
}
else
{
row["Role"] = "NOPE";
}
dt.Rows.Add(row);
}
dataGridView1.DataSource = dt;
DataRow[] drr = dt.Select("Role='NOPE'");
for (int i = 0; i < drr.Length; i++)
drr[i].Delete();
dt.AcceptChanges();
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
public void StartingLineups()
{
upass.upass up=新的upass.upass();
字符串地址3=”https://api.mysportsfeeds.com/v1.1/pull/nba/2017-2018-regular/game_startinglineup.json?gameid=“+dateTimePicker1.Text+comboBox2.Text;
var w3=新的WebClient();
w3.UseDefaultCredentials=true;
w3.Credentials=新的网络凭据(up.username,up.password);
var result3=w3.DownloadString(地址3);
var obj3=JObject.Parse(result3);
StartingLineup.StartingLineup sl=新的StartingLineup.StartingLineup();
尝试
{
foreach(obj3[“游戏开始列表”][“团队列表”]中的JToken儿童)
{
foreach(子项中的JToken子项[“预期”][“起始”])
{
JsonConvert.SerializeObject(子对象,
Newtonsoft.Json.Formatting.None,
新JsonSerializerSettings
{
NullValueHandling=NullValueHandling.Ignore
});
sl.player=sub[“player”][“FirstName”].ToString()+“”+sub[“player”][“LastName”].ToString();
sl.team=child[“team”][“City”].ToString()+“”+child[“team”][“Name”].ToString();
sl.position=sub[“position”].ToString();
sl.playerposition=sub[“player”][“Position”].ToString();
DataRow row=dt.NewRow();
行[“团队”]=sl.Team;
行[“玩家”]=sl.Player;
行[“位置”]=sl.playerposition;
如果(sl.position.包含(“启动器”))
{
行[“角色”]=sl.position;
}
其他的
{
行[“角色”]=“否”;
}
dt.行。添加(行);
}
dataGridView1.DataSource=dt;
DataRow[]drr=dt.Select(“Role='NOPE');
对于(int i=0;i
在检查可空值()时,请考虑这一点:
var testObj=newnewtonsoft.Json.Linq.JObject();
if(testObj.TryGetValue(“player”,out Newtonsoft.Json.Linq.JToken令牌)){
string yourString=token.Value(“FirstName”);//可以为空
int?yourNullableInt=token.Value(“AnyNumber”);//可以为null
int yourInt=token.Value(“AnyNumber”)??0;//如果为空,则可以为0
int yourInt=token.SelectToken(“第一层”)?.SelectToken(“第二层”)?.Value(“任意数”)??0;//按路径返回值
}
SelectToken也适用于。在检查可空值()时,请考虑这一点: var testObj=newnewtonsoft.Json.Linq.JObject(); if(testObj.TryGetValue(“player”,out Newtonsoft.Json.Linq.JToken令牌)){ string yourString=token.Value(“FirstName”);//可以为空 int?yourNullableInt=token.Value(“AnyNumber”);//可以为null int yourInt=token.Value(“AnyNumber”)??0;//如果为空,则可以为0 int yourInt=token.SelectToken(“第一层”)?.SelectToken(“第二层”)?.Value(“任意数”)??0;//按路径返回值 }
SelectToken也适用于。为什么不处理
JsonConvert.SerializeObject(sub,Newtonsoft.Json.Formatting.None,new JsonSerializerSettings)的输出字符串{NullValueHandling=NullValueHandling.Ignore})
?您仍然必须检查null。这与期望myNullObject.ChildProperty
成功没有什么不同。NullValueHandling.Ignore
只意味着如果值为null
,当您序列化为JSON时属性将不存在。为什么对JsonConvert.SerializeObjec的输出字符串不做任何操作t(sub,Newtonsoft.Json.Formatting.None,新JsonSerializerSettings{NullValueHandling=NullValueHandling.Ignore})
?您仍然必须检查null。这与期望myNullObject.ChildProperty
成功没有什么不同。NullValueHandling.Ignore
只意味着如果值为null
,则序列化为JSON时该属性将不存在。
var testObj = new Newtonsoft.Json.Linq.JObject();
if (testObj.TryGetValue("player", out Newtonsoft.Json.Linq.JToken token)) {
string yourString = token.Value<string>("FirstName"); // can be null
int? yourNullableInt = token.Value<int?>("AnyNumber"); // can be null
int yourInt = token.Value<int?>("AnyNumber") ?? 0; // can be 0 if null
int yourInt = token.SelectToken("firstLayer")?.SelectToken("secondLayer")?.Value<int?>("anyNumber") ?? 0; // return value by path
}