【问题标题】:JSON navigating [duplicate]JSON导航[重复]
【发布时间】:2016-06-26 00:22:35
【问题描述】:

您好,我有一个使用 NewstonSoft JSon.NET 反序列化为字符串 var 的 JSON,如下所示:

data = {"123456789": [{
"queue": "RANKED_SOLO_5x5",
"name": "Karthus's Captains",
"entries": [{
  "leaguePoints": 37,
  "isFreshBlood": false,
  "isHotStreak": false,
  "division": "I",
  "isInactive": false,
  "isVeteran": true,
  "losses": 124,
  "playerOrTeamName": "Nickname",
  "playerOrTeamId": "123456789",
  "wins": 136
}],
"tier": "SILVER"
}]}

我想知道如何访问“条目”内的联赛积分。提前致谢

【问题讨论】:

  • 我想访问一个特殊的条目来将 iut 分配给一个 var,而不是创建一个特殊的类

标签: c# json json.net


【解决方案1】:

如果您不想将 JSON 反序列化为具体的类(如 this quite similar question 中所要求的那样),您可以像这样使用 JSON.NET 的 JObject-class:

string jsonData = GetJsonStringFormSomewhere();
var jObject = (JObject)JsonConvert.DeserializeObject(jsonData);

var idOrWhatever = jObject["123456789"].First();
var firstEntry = idOrWhatever["entries"].First();
var leaguePoints = firstEntry["leaguePoints"].Value<int>();

【讨论】:

  • 是否可以反序列化为字典?
【解决方案2】:

使用 Newtonsoft 有不同的方法来执行此操作。一种不序列化到整个对象的方法可能是这样的;

    JToken first = JObject.Parse(data);
    JArray res = (JArray)first.SelectToken("123456789");
    JToken entries = (JToken)JObject.Parse(res[0].ToString());
    JArray result = JArray.Parse(entries.SelectToken("entries").ToString());

    int leaguePoints = (int)result[0].SelectToken("leaguePoints");

我很快就完成了,并将其逐行拆分,以便您可以看到每个步骤,但这意味着它不是很优雅,您当然可以将其连接起来或使用 linq 来获取您的数据。

【讨论】:

  • 请注意,Parse 的额外调用不是必需的(实际上是多余的),因为整个对象已经在您的第一行中解析。所以不用JToken entries = (JToken)JObject.Parse(res[0].ToString());,你可以简单地做JToken entries = res[0];。这也适用于您列表的下一行。
猜你喜欢
  • 2017-05-16
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2018-07-09
  • 2021-04-09
  • 2012-03-01
相关资源
最近更新 更多